c# - 如何从 MenuItems 冒泡事件

标签 c# wpf .net-4.5

在这个应用程序中,我在用户控件中放置了一个菜单。

<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/

相关文章:

c# - 使用 System.Text.Json 将 JSON 反序列化为对象

c# - 将键/值对列表转换为数据表

c# - 发送大文件/内容时 HttpClient 是否存在缺陷?

c# - 如果使用 Enterprise Library,log4net 是否更适合登录?

c# - 为什么 Task<HttpResponseMessage> 在我的项目中不可等待?

c# - SignalR 2.0.2 创建持久连接

c# - 按名称属性比较文本框控件

c# - 如何使用 Prism 和 Unity 显示一个 View 的多个实例

c# - 字段更改时,MVVM 对象触发属性更改事件

c# - .NET 4.5 和 C# 中使用 HttpClient 的 HTTP HEAD 请求