我使用自己的自定义事件构建了自己的 UserControl(我从单独的程序集中使用),在父项目中我想将这些事件与 Commands 一起使用,因为它是一个 MVVM 应用程序,全部使用 Behaviors SDK (XAML) for Visual Studio 2013 ,如下:
<mediaPlayerControl:PlayerControl>
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="ForwardClicked">
<core:InvokeCommandAction Command="{Binding OnForwardClicked, Mode=TwoWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</mediaPlayerControl:PlayerControl>
问题是 EventTriggerBehavior 仅支持某些特定事件,如前所述 here ,因此我在我的事件中使用的命令不会触发,现在,我想做的是构建提供相同体验并支持我自己的事件的行为:我希望它们看起来类似于:
<mediaPlayerControl:PlayerControl>
<interactivity:Interaction.Behaviors>
<core:ExtensionsEventTriggerBehavior EventName="ForwardClicked">
<core:ExtensionsInvokeCommandAction Command="{Binding OnForwardClicked, Mode=TwoWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</mediaPlayerControl:PlayerControl>
我已经阅读了很多关于实现此类行为的文章,但我无法弄清楚,因为这是我第一次以这种方式处理它们,我希望你能告诉我该怎么做。
最佳答案
首先,您通常不会在 UserControls XAML 页面内添加行为,您会在使用 UserControl 的 XAML 页面上添加行为,所以我认为您需要这样的东西:
您可以简单地添加一个类型为 EventHandler
的公共(public)事件,例如“ForwardButtonClicked”到您的用户控件的代码隐藏:
public event EventHandler ForwardButtonClicked;
然后您还必须添加一个 EventHandler 方法,以便在单击 View 上的按钮时触发您的事件。因此,您将在用户控件的构造函数中添加一个事件处理程序方法:
public PlayerControl()
{
this.InitializeComponent();
_forwardButton.Click += this.ForwardButtonClickedEventHandler;
}
事件处理程序看起来像:
private void ForwardButtonClickedEventHandler(object sender, RoutedEventArgs eventArgs)
{
if(this.ForwardButtonClicked != null)
{
this.ForwardButtonClicked.Invoke(sender, new EventArgs());
}
}
然后,您可以将 UserControl 添加到 XAML 页面,并为 UserControl 的 ForwardButtonClicked 事件添加 EventTriggerBehavior。 由于 WinRT 中不支持自定义 RoutedEvents,您可以使用默认的单击 RoutedEventHandler 而不是普通的 C# EventHandler,因为您缺少事件的冒泡和隧道。但我不知道这是否有效,我没有尝试过,因为我还不需要冒泡或隧道。 如果有人有更好的解决方案,我将不胜感激。
关于c# - 构建支持我自己的自定义事件的 EventTriggerBehavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845169/