36

ListBox 内のアイテムがマウスでクリックされたときに、既に選択されているかどうかに関係なく、通知を受け取りたいです。

私はこれを検索して見つけました: ( http://kevin-berridge.blogspot.com/2008/06/wpf-listboxitem-double-click.htmlコメントを参照)

private void AddDoubleClickEventStyle(ListBox listBox, MouseButtonEventHandler mouseButtonEventHandler)
{
    if (listBox.ItemContainerStyle == null)
        listBox.ItemContainerStyle = new Style(typeof(ListBoxItem));
    listBox.ItemContainerStyle.Setters.Add(new EventSetter()
    {
        Event = MouseDoubleClickEvent,
        Handler = mouseButtonEventHandler
    });
}

//Usage:
AddDoubleClickEventStyle(listView1, new MouseButtonEventHandler(listView1_MouseDoubleClick));

これは機能しますが、DoubleClick. ただし、ワンクリックで機能させることはできません。試してみました-イベントMouseLeftButtonDownEventがないようですが、呼び出されていません。MouseClick

もう少し一般的な副次的な質問: どのイベントが存在し、どのハンドラーがそれらに対応し、いつ実際に何かを実行するかを確認するにはどうすればよいですか? たとえば、 aMouseDoubleClickEventには が必要だと何がわかりますMouseButtonEventHandlerか? たぶん、MouseLeftButtonDownEvent他のハンドラーが必要なのですが、それが機能していないのですか?

サブクラス化ListBoxItemとオーバーライドも試しOnMouseLeftButtonDownましたが、どちらも呼び出されません。

マルク

4

6 に答える 6

22

アンディの答えの最初の選択肢である、を使用PreviewMouseLeftButtonDownすることは、これを実行する方法だと思います。XAMLでは、次のようになります。

<ListBox Name="testListBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter
                Event="PreviewMouseLeftButtonDown" 
                Handler="ListBox_MouseLeftButtonDown" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
于 2009-08-13T16:26:23.717 に答える
10

ListBox で MouseDown イベントを取得する別の方法があります。メソッドhandledEventsTooのシグネチャを使用して、処理済みとしてマークされたイベントのイベント ハンドラーを追加できます。AddHandler

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

上記の 3 番目のパラメーターhandledEventsTooは、このハンドラーが既にマークされているかどうかに関係なく呼び出されることを保証しますHandled(これListBoxItemは ListBox で行われます)。
詳細については、ルーティング イベントを処理済みとしてマークする、およびクラス処理を参照してください。 たとえば、ListBox の MouseDown イベントにアタッチする方法を
参照してください。

于 2010-07-25T14:49:36.513 に答える