web-dev-qa-db-ja.com

WPFのリストボックスのアイテムでマウスクリックをキャプチャする方法は?

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に対して機能します。しかし、1回クリックするだけでは機能しません。 MouseLeftButtonDownEventイベントは発生していないようですが、呼び出されていませんので、MouseClickを試しました。

もう少し一般的な側面の質問:どのようなイベントが存在し、どのハンドラーがそれらに対応し、いつ実際に何かを実行するかをどのように確認できますか?たとえば、MouseDoubleClickEventにはMouseButtonEventHandlerが必要だということを教えてください。おそらくMouseLeftButtonDownEventのために他のハンドラが必要なのですが、それが機能しないのはなぜですか?

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

マーク

33
marc40000

PreviewMouseLeftButtonDownを使用することについてのAndyの最初の答えは、この問題を解決する方法だと思います。 XAMLでは、次のようになります。

<ListBox Name="testListBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBox_MouseLeftButtonDown" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
17
RandomEngy

別の方法もあります-PreviewMouseDownイベントを処理し、リストアイテムによってトリガーされたかどうかを確認する:

XAMLの場合:

<ListBox PreviewMouseDown="PlaceholdersListBox_OnPreviewMouseDown"/> 

分離コードで:

private void PlaceholdersListBox_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var item = ItemsControl.ContainerFromElement(sender as ListBox, e.OriginalSource as DependencyObject) as ListBoxItem;
    if (item != null)
    {
        // ListBox item clicked - do some cool things here
    }
}

this answerに触発されましたが、名前でリストボックスを使用しています。不要な依存関係を避けるために、sender引数を使用することを提案します。

14
Pavel K

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

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

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

9
zendar

SelectionChangedイベントのSelectionChangedEventArgs引数を使用して、AddedItemsおよびRemovedItemsを介して追加または削除されるアイテムを検索できます。通常は、最後にクリックされたアイテムのみが表示されます。

0
amirhp

Event="MouseLeftButtonUp"を使用できます
"PreviewLeftButtonDown"とは異なり、ListBoxItemも処理されます。

0
elig