0

我在为特定的 TreeViewItem 指定 ContextMenu 时遇到了一点问题:

    <TreeView x:Name="_filesTree">
    <TreeView.Resources>
        <ContextMenu x:Key="_rootContextMenu">
            <MenuItem Header="Add..." Click="MenuItem_Click" />
        </ContextMenu>
    </TreeView.Resources>
    <TreeViewItem Header="Persistent" ContextMenu="{DynamicResource _rootContextMenu}"/>
    <TreeViewItem Header="Temporary" ContextMenu="{DynamicResource _rootContextMenu}" />
</TreeView>

点击处理程序:

        private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        Point menuClickPoint = ((sender as FrameworkElement).Parent as ContextMenu).TranslatePoint(new Point(0, 0), _filesTree);
        DependencyObject obj = _filesTree.InputHitTest(menuClickPoint) as DependencyObject;

        while (obj != null && !(obj is TreeViewItem))
        {
            obj = VisualTreeHelper.GetParent(obj);
        }

        (obj as TreeViewItem).Items.Add("(new)");
    }

在我的 *MenuItem_Click* 事件处理程序中,我将新的 TreeViewItems 添加到单击的项目中,效果很好。但是在添加新的(例如到“持久”子树)之后,右键单击这个新子项会再次打开上下文菜单。这是我不需要的东西,因为我需要这些新添加的项目的另一个上下文菜单(带有删除选项)。如何实现上下文菜单仅在右键单击根项(TextBlock)而不是在子树内时打开?

谢谢

4

1 回答 1

0

我为每个子项明确定义了新的上下文菜单:

        TreeViewItem tvi = new TreeViewItem();
        tvi.ContextMenu =(ContextMenu) this._filesTree.Resources["_subItemContextMenu"];
        tvi.Header = "(new)";

        (obj as TreeViewItem).Items.Add(tvi);

树视图资源中的 *_subItemContextMenu*:

<ContextMenu x:Key="_subItemContextMenu">
        <MenuItem Header="Remove" Click="MenuItem_Remove" />
</ContextMenu>
于 2013-07-03T15:56:51.197 回答