在这个应用程序中,我在用户控件中放置了一个菜单。
<UserControl>
<Grid>
<Menu x:Name="mainMenu">
<MenuItem Header="File">
<MenuItem Header="Open Analysis">
<MenuItem Header="Load all" />
<MenuItem Header="Select from tracks" />
</MenuItem>
</MenuItem>
</Menu>
</Grid>
</UserControl>
我想将菜单上的所有“单击”事件路由并冒泡到 Usercontrol 中的单个 Click 事件。 所以我实现了:
public static readonly RoutedEvent ClickEvent = eventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuItem));
public event RoutedEventHandler Click
{
add { AddHandler(ClickEvent, value); }
remove { RemoveHandler(ClickEvent, value); }
}
但是在异常(exception)情况下失败了:
{"RoutedEvent Name 'Click' for OwnerType 'System.Windows.Controls.MenuItem'
already used."}
我想这是事件注册了多次,因为有多个菜单项,所以第二次注册失败了。
但是我如何才能以一种易于维护的方式将所有这些事件“捆绑”(如单一处理程序连接点)到用户控件中的一个事件中?由于一些子菜单由数据库提供,因此是动态构建的。
最佳答案
除了已经说过的内容之外,我还会研究一个简单的消息传递解决方案。
每次单击任何菜单项时,您都可以广播类型为 MenuItemClickedMessage
的消息。
public class MenuItemClickedMessage
{
public MenuItem MenuItemClicked { get; set; }
}
然后您可以使用一个组件来监听该事件。一旦它收到事件,您就可以从 MenuItemClicked
属性中提取菜单项并做出相应的 react 。
这需要对简单的消息传递解决方案进行一些研究:http://rachel53461.wordpress.com/2011/05/28/switching-between-viewsusercontrols-using-mvvm/
关于c# - 如何从 MenuItems 冒泡事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725083/