以"样式"连接处理程序到ContextMenu部分

本文关键字:quot ContextMenu 部分 程序 连接 样式 连接处 处理 | 更新日期: 2023-09-27 18:14:27

我需要在运行时创建ContextMenu的结构,因为菜单中MenuItem的存在是基于许多因素的。我试着这样添加处理程序到ContextMenuOpening事件:

XAML

<TreeView x:Name="ArticlesTreeView" Grid.Column="0" AllowDrop="True">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu Opened="ContextMenu_OnOpened">
                        <MenuItem Header="First item"></MenuItem>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

这段代码将XamlParseException抛出到<ContextMenu Opened="ContextMenu_OnOpened">行。我可以用另一种方式解决问题吗?

UPD我发现对我来说没有必要ContextMenuOpeningOpened事件。我改正了上面的代码。

以"样式"连接处理程序到ContextMenu部分

尝试在treeview的ItemTemplate上创建您的ContextMenu。试试下面的代码(它是不完整的,但我希望你得到的想法)

<TreeView .....>
<TreeView.ItemTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.ContextMenu>
<ContextMenu ContextMenuOpening="ContextMenu_OnContextMenuOpening">
                        <MenuItem Header="First item"></MenuItem>
                    </ContextMenu>
</ContentControl.ContextMenu>
---------Your Item Template here
</ContentControl>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>

你的问题在这里已经有答案了。

将事件处理程序放在事件设置器中完成了工作。

<TreeView x:Name="ArticlesTreeView"  AllowDrop="True">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="First item">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <EventSetter Event="Click" Handler="ContextMenu_ContextMenuOpening_1"></EventSetter>
                                </Style>
                            </MenuItem.Style>
                            </MenuItem>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeViewItem>
        </TreeViewItem>
    </TreeView>

还可以将事件处理程序后面的代码更改为

  private void ContextMenu_ContextMenuOpening_1(object sender, RoutedEventArgs e)
    {
    }