WPF ControllTemplate Triggers小記 - 簡書
阿新 • • 發佈:2019-04-10
spa lte app run actions 函數 current count checked 原文:WPF ControllTemplate Triggers小記 - 簡書
WPF中,樣式模板中如果定義EventTrigger事件方式實現動畫。那麽需要註意兩點:
1、對於綁定的屬性的EventTrigger,綁定值不能有更改。例如,ToggleButton.Checked和ToggleButton.UnChecked定義了EventTrgger,實現選中的BeginStoryboard動畫,那麽在引用的該樣式的ToggleButton,xaml中綁定,IsChecked="{Binding IsChecked}"。當IsChecked的值不是默認值(false)時將在構造窗口時拋出異常:在“System.Windows.Controls.ControlTemplate”的名稱領域內找到“xxx”名稱。”
我曾試過在構造函數,執行,延時架在你時綁定:
嘗試1
App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(() => {
btnMuted.SetBinding(ToggleButton.IsCheckedProperty, new Binding("IsChecked") { Source = accountViewModel.AppViewModel.SettingsView });
}));
調節多次調度程序為,Load,ApplicationIdle等均拋出異常。
嘗試2:
Task.Run(new Action(()=> {
Thread.Sleep(100);
App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(() => {
btnMuted.SetBinding(ToggleButton.IsCheckedProperty, new Binding("IsChecked") { Source = accountViewModel.AppViewModel.SettingsView });
}));
}));
當Sleep時間充足時(取決系統響應),可正常工作。
嘗試3:
btnMuted.Loaded += (o, e)=>{
btnMuted.SetBinding(ToggleButton.IsCheckedProperty, new Binding("IsChecked") { Source = accountViewModel.AppViewModel.SettingsView });
};
這樣也是可行的
嘗試4:
IsChecked="{Binding AppViewModel.SettingsView.IsChecked, Delay=3000}"
通過增加綁定變化的延時時間,但是結果是無效的
但這不是我們想要的結果對於MVVM模式,再去寫這樣的代碼顯得略微繁重。
2、我們可以使用 Trigger代替,避免使用EventTrigger
例如:
<ControlTemplate.Triggers>
<!--<EventTrigger RoutedEvent="ToggleButton.Checked">
<BeginStoryboard Storyboard="{StaticResource OnChecked1}"/>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked">
<BeginStoryboard x:Name="OnUnchecked1_BeginStoryboard" Storyboard="{StaticResource OnUnchecked1}"/>
</EventTrigger>-->
<Trigger Property="IsChecked" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource OnChecked1}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard x:Name="OnUnchecked1_BeginStoryboard" Storyboard="{StaticResource OnUnchecked1}"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
這樣就可以完美解決了。
WPF ControllTemplate Triggers小記 - 簡書