在这个应用程序中,我在一个用户控件中放置了一个菜单。
我希望将菜单上的所有“click”事件路由和冒泡到Usercontrol中的一个Click事件。因此,我实现了以下代码:
但是这在异常情况下会失败:
<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>
我希望将菜单上的所有“click”事件路由和冒泡到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); }
}
但是这在异常情况下会失败:
{"RoutedEvent Name 'Click' for OwnerType 'System.Windows.Controls.MenuItem'
already used."}
我猜这个事件被注册了多次,因为有多个菜单项,所以第二次注册失败。
但是,我怎样才能将所有这些事件“捆绑”(就像一个单一的处理程序附加点)成一个用户控件中的单个事件,并以良好的可维护方式?由于某些子菜单由数据库提供,因此是动态构建的。
if (MenuItemSender.Header == "Load all") { LoadAll(); }
。不过,在此情况下创建事件的做法并不值得推荐,因为已经有Click
和MouseLeftButtonDown
事件可以使用了。 - Anatoliy NikolaevUserControl
将所有这些元素组合在一起,不应该与它们绑定,因为今天你需要一个菜单项/按钮,那么在UserControl
中需要实现其他使用其他事件的元素。特别是,有些人(包括我)更喜欢使用DataTemplate
,如果使用DataTemplate
代替UserControl
会怎样呢?这不涉及任何事件。希望UserControl
不依赖于其中的元素。 - Anatoliy Nikolaev