【问题标题】:Click button programmatically and show pressed animation以编程方式单击按钮并显示按下的动画
【发布时间】:2013-06-27 23:33:11
【问题描述】:

WPF/.NET4 我有Button1。它有 MouseOver 和 Pressed Animations。我想用键盘上的键单击按钮。我尝试过自动化,例如:

ButtonAutomationPeer peer= new ButtonAutomationPeer(Button1);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();

这会引发 Button1 单击事件处理程序。我也试过这个:

Button1.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

这两个工作正常,但这些都没有显示按钮的按下状态。他们引发事件处理程序并运行按钮的内部代码,但在单击按钮时不显示按钮的反应。未显示按下状态。我该怎么做?谢谢

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您可以在引发事件之前调用VisualStateManager.GoToState 方法。

    VisualStateManager.GoToState(Button1, "Pressed", true);
    Button1.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
    

    这样做的问题是动画是异步运行的,因此引发事件后的任何代码行都会立即执行。一种解决方法是获取在调用GoToState 时调用的Storyboard

    为此,您可以使用GetVisualStateGroups

    var vsGroups = VisualStateManager.GetVisualStateGroups(VisualTreeHelper.GetChild(Button1, 0) as FrameworkElement);
    VisualStateGroup vsg = vsGroups[0] as VisualStateGroup;
    
    if (vsg!= null)
    {
        //1 may need to change based on the number of states you have
        //in this example, 1 represents the "Pressed" state
        var vState = vsg.States[1] as VisualState;
        vState.Storyboard.Completed += (s,e)
                {
                    VisualStateManager.GoToState(Button1, "Normal", true);
    
                    //Now that the animation is complete, raise the Button1 event
                    Button1.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
                };
    }
    
    //Animate the "Pressed" visual state
    VisualStateManager.GoToState(Button1, "Pressed", true);
    

    您可能希望存储Storyboard(位于vState.Storyboard 中,这样您就不必每次都执行搜索,但这应该让您知道动画何时完成,然后您可以继续其余代码(在本例中,我们引发 Button1 事件)。

    【讨论】:

    • 谢谢,效果很好。你能告诉我如何将它恢复到正常状态吗?实际上我需要按下那个按钮,然后说 10 毫秒后恢复正常。我试过: VisualStateManager.GoToState(Button1, "Normal", true);但这会立即更改,因此按钮始终显示正常状态,我什至在正常状态之前添加了线程睡眠但未显示
    • 我已经更新了我的答案。它展示了如何获取Pressed 动画的Storyboard,然后您可以通过将事件处理程序附加到Complete 事件来检测动画何时完成。在此事件处理程序中,您可以引发 Button1 事件。
    • 非常感谢,但是 Completed 事件没有触发,就像第一个解决方案它按下按钮但永远不会返回到正常状态
    • 你的vState有什么价值?
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 2019-08-05
    • 2017-06-17
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多