5

ベースのコントロールを開発していTreeViewますが、ダブルクリックイベントがノードをバブルし続けていますTreeViewItem

目標は、TreeViewItemダブルクリックしたときに展開または折りたたむことです。

イベントのイベントハンドラーをMouseDoubleClickそれぞれに適用するスタイルがありますTreeViewItem

イベントを処理するコードは次のとおりです


private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e )
{
    // Get the specific tree view item that was double clicked
    TreeViewItem treeViewItem = sender as TreeViewItem;

    // not null?
    if( null != treeViewItem )
    {
         // Switch expanded state
         if( true == treeViewItem.IsExpanded )
         {
             treeViewItem.IsExpanded = false;
         }
         else
         {
             treeViewItem.IsExpanded = true;
         }

         // Set event handled
         e.Handled = true; // [1]
    }
}

これはトップレベルでは問題なく機能TreeViewItemしますが、子をダブルクリックすると、イベントによってツリーがバブルアップし、ブランチ全体が崩壊します。なぜイベントはバブルを続けているのですか?前述のように、[1]私はイベントを処理済みとして設定しています。

4

2 に答える 2

2

私自身の質問に答えるのは嫌いですが、これが私が最終的に使用するようになった解決策です。

イベントが処理されるかどうかに関係なく、ブランチ内のTreeViewItemごとに(子からルートまで)MouseDoubleClickが発生することを指定したいくつかのソースに出くわした後、この質問の回答を利用しました。

WPF TreeView、PreviewMouseDownイベントでTreeViewItemを取得します

マウスイベントの下にあったTreeViewItemを取得します。現在の送信者がマウスイベントのTreeViewItemと等しい場合、必要に応じて展開/折りたたみます。それ以外の場合は、イベントを無視して何もしません。

于 2010-08-10T21:32:53.150 に答える
0

理由はわかりませんが、選択した答えがすべての人に役立つわけではありませんでしTreeViewItemsた。そのため、私は単純なアプローチを使用して、複数回boolの再インターンからフェンスを設定しました。TreeViewItemDoubleClicked

private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e )
{
    // Make sure the event has never been handled first
    if (bubblingBulkwark)
        return;

    // Get the specific tree view item that was double clicked
    TreeViewItem treeViewItem = sender as TreeViewItem;

    // not null?
    if( null != treeViewItem )
    {
         // Switch expanded state
         if( true == treeViewItem.IsExpanded )
         {
             treeViewItem.IsExpanded = false;
         }
         else
         {
             treeViewItem.IsExpanded = true;
         }

         // Raise bulkwark
         bubblingBulkwark = true;
    }
}

呼び出された最初のハンドラーを完全に実行できるようにするには(したがって、子のハンドラーが親のハンドラーの前に呼び出されるという事実に依存します)、次を追加するだけです。

private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    bubblingBulkwark = false;
}

そして、それを登録することを忘れないでください。

treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
于 2018-04-15T14:43:55.633 に答える