在“样式”部分中将处理程序连接到ContextMenu

时间:2014-07-24 08:17:46

标签: c# wpf xaml contextmenu handler

我需要在运行时创建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事件。我纠正了上层代码。

2 个答案:

答案 0 :(得分:2)

尝试在树视图的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>

答案 1 :(得分:0)

您的问题已经回答here

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

<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)
    {

    }