首页 > 解决方案 > 将事件处理程序添加到 ResourceDictionary 内的 ContextMenu 内的 MenuItem

问题描述

我有一个TreeView, 和一个ResourceDictionary, 包含一个ContextMenu, 和(当前)一个MenuItem. (我稍后会添加更多MenuItem。)

我正在尝试通过 C# 代码隐藏添加一个事件。我知道想要通过代码隐藏而不是仅仅在 XAML 中指定它有点奇怪,但这是我需要为其他要求做的事情。

所以,我的层次结构是:

所以,现在我转到代码隐藏,我可以在这个层次结构中导航,我可以添加事件处理程序。

通过代码隐藏有更好的方法吗?


代码隐藏

var contextmenu = treeView.TryFindResource("allRequirementGroupsMenu") as ContextMenu;
var mnu_create_reqgrp = contextmenu.Items.OfType<MenuItem>()
                        .FirstOrDefault(item => 
                            item.Name == "mnuItem_CreateRequirementGroup");
if(mnu_create_reqgrp != null)
    mnu_create_reqgrp.Click += RequirementGroup_Create_Click;

XAML

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="1600">
    <Grid>
        <TreeView x:Name="treeView">
            <TreeView.Resources>
                <ResourceDictionary>
                    <ContextMenu x:Key="allRequirementGroupsMenu" 
                                 StaysOpen="True">
                        <MenuItem Header="Create Requirement Group"  
                                  Name="mnuItem_CreateRequirementGroup" />
                    </ContextMenu>
                </ResourceDictionary>
            </TreeView.Resources>
            <TreeViewItem Header="Vendors" 
                          ItemsSource="{Binding Vendors}" />
            <TreeViewItem Header="Checklists" 
                          ItemsSource="{Binding Checklists}" />
            <TreeViewItem Header="Requirement Groups" 
                          ItemsSource="{Binding RequirementGroups}" 
                          ContextMenu="{StaticResource allRequirementGroupsMenu}" />
            <TreeViewItem Header="Ungrouped Items" 
                          ItemsSource="{Binding UngroupedItems}" />
        </TreeView>
    </Grid>
</Window>

标签: c#wpfxaml

解决方案


推荐阅读