4

マウスと対話するコントロールを含む ItemTemplate を持つ ListBox があります。これにより、ListBox の選択機能が妨げられます。つまり、コントロールをクリックしても項目が選択されません。これは、ListBoxItem が OnMouseLeftButtonDown でマウス イベントの Handled プロパティを true に設定するためです。私は次のことを試しました

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    e.Handled = false;
}

ただし、ListBoxItem はマウスを「引き継いで」、コントロールが独自の対話を行うのを防ぎます。それから私は別のアイデアを思いついた

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    ((ListBoxItem)VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(this)))).IsSelected = true;
}

これは実際には機能しますが、エレガントなソリューションというよりも、醜いクラッジのように感じます. ビジュアル ツリーの正確な内容に依存しない、より良い解決策はありますか?

4

3 に答える 3

0

私は、それほど面倒ではない方法を見つけました:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    Selector.SetIsSelected(this, true);
}

これが効果を発揮するには、ListBox の ItemTemplate のコントロールに次の XAML 属性が必要です。

Selector.IsSelected="{Binding IsSelected, Mode=OneWayToSource, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"

それは2つの新しい質問を提起します:

  1. 現在使用されていないアタッチされたプロパティを見つけるよりも、独自の依存関係プロパティを定義する方がよいでしょうか?
  2. マークアップのみで同様のことを達成する方法はありますか?
于 2010-05-24T11:26:37.947 に答える
0

これは簡単な解決策の 1 つですが、残念ながらハンドラーはマークアップではなくコードでのみアタッチできます。メソッドのシグネチャを
使用して、イベント ハンドラーを追加できます。handledEventsTooAddHandler

myListBox.AddHandler(UIElement.MouseDownEvent, 
        new MouseButtonEventHandler(ListBox_MouseDown), true);

上記の 3 番目のパラメーターhandledEventsTooは、このハンドラーが既にマークされているかどうかに関係なく呼び出されることを保証しますHandled(これListBoxItemは ListBox で行われます)。

詳細については、ルーティング イベントを処理済みとしてマークする、およびクラス処理を参照してください。 たとえば、ListBox の MouseDown イベントにアタッチする方法を
参照してください。

于 2010-07-25T14:58:33.480 に答える
0

MouseLeftButtonDown はトンネリング イベントだと思います。PreviewMouseLeftButtonDown を使用して、そこで処理を行い、e.Handled = false; を確認できます。あなたがすでに試したように - それはうまくいくはずです!

それが役立つことを願っています。

于 2010-07-06T12:16:27.697 に答える