3

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));

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

4

1 回答 1

3

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

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

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

为此,您可以使用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);

您可能想要存储StoryboardvState.Storyboard这样您就不必每次都执行搜索,但这应该让您知道动画何时完成,然后您可以继续执行其余代码(在这种情况下我们提出了这个Button1事件)。

于 2013-06-30T20:38:53.007 回答