1. 程式人生 > >WPF ControllTemplate Triggers小記 - 簡書

WPF ControllTemplate Triggers小記 - 簡書

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小記 - 簡書