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));
这两个工作正常但没有一个显示按钮的按下状态。他们引发事件处理程序并运行按钮的内部代码,但是在单击按钮时不显示按钮的反应。未显示按下状态。我该怎么办?感谢
答案 0 :(得分: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);
您可能希望存储Storyboard
(位于vState.Storyboard
中,这样您就不必每次都执行搜索,但这可以让您知道动画何时完成,您可以然后继续使用剩下的代码(在这种情况下,我们引发Button1
事件)。