美文网首页
WPF ControllTemplate Triggers小记

WPF ControllTemplate Triggers小记

作者: Imjeef | 来源:发表于2019-01-16 19:54 被阅读0次

    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.haomeiwen.com/subject/pylvdqtx.html