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 を追加しています。ただし、新しいものを追加した後 (たとえば、"Persistent" サブツリーに)、この新しいサブアイテムを右クリックすると、コンテキスト メニューが再び開きます。これらの新しく追加されたアイテムには別のコンテキスト メニューが必要なので ([削除] オプションを使用)、これは必要ありません。サブツリー内ではなく、ルート項目 (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 に答える