首页 > Windows开发 > 详细

WPF ControllTemplate Triggers小记 - 简书

时间:2019-04-10 13:16:35      阅读:229      评论:0      收藏:0      [点我收藏+]
原文: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小记 - 简书

原文:https://www.cnblogs.com/lonelyxmas/p/10682471.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!