3


1

私は2本の木があります。

  1. fooTree - 要素で構成されています

  2. barTree - によって構築された

どちらのツリーにもMouseRightButtonDownイベントがありますが、e.Source型は異なります。

  1. fooTree - System.Windows.Controls.TreeViewItem

  2. barTree - System.Windows.Controls.TreeView

なぜe.Sourceが違うの? また、barTreeのクリックされたアイテムを取得する方法はありますか。

マークアップ:


コード:

パブリック部分クラスWindow1:Window {public Window1(){InitializeComponent();} this.DataContext = this; }

パブリック文字列[] BarItems {get {return新しい文字列[] {"bar"、 "bar"}; }}

private void barTree_MouseDown(オブジェクトセンダ、MouseButtonEventArgs e){}

プライベートボイドfooTree_MouseDown(オブジェクトセンダ、MouseButtonEventArgs e){}}

2 Answer


8


なぜこれが起こるのかわからないが、少なくとも私は解決策を見つけました:

_ . ハンドラがTreeViewにある場合、OriginalSourceプロパティを使用します イベント引数を取得し、TreeViewItemが見つかるまで視覚的な親チェーンを調べます。 それを選択します。 System.Windows.Media.VisualTreeHelper.GetParentを使用して視覚的な親チェーンをたどることができます。 . TreeViewItem型のクラスハンドラーを登録して、 マウスダウンイベント。 それから、マウスイベントがTreeViewItem要素を通過するときだけ、あなたのハンドラは呼ばれるべきです。 . TreeViewItem型のクラスハンドラーを登録し、 コンテキストメニューを開くイベント。 _

だから私のコードは:

private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem treeViewItem = VisualUpwardSearch(e.OriginalSource as DependencyObject) as TreeViewItem;
}

static DependencyObject VisualUpwardSearch(DependencyObject source)
{
    while (source != null && source.GetType() != typeof(T))
        source = VisualTreeHelper.GetParent(source);

    return source;
}


1


クリックしたアイテムは、次のようにしてバートツリーで取得できます。

(TreeViewとしての(e.Source)).SelectedValue

ただし、項目は実際に最初に選択される必要があることに注意してください(leftMouseを使用)。 アイテムはrightMouseを使ってすぐには選択されません…​