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
をオーバーライドしましたが、どちらも呼び出されません。
マーク
PreviewMouseLeftButtonDownを使用することについてのAndyの最初の答えは、この問題を解決する方法だと思います。 XAMLでは、次のようになります。
<ListBox Name="testListBox">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBox_MouseLeftButtonDown" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
別の方法もあります-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引数を使用することを提案します。
ListBoxでMouseDownイベントを取得する別の方法があります。 handledEventsToo
メソッドのAddHandler
シグネチャを使用して、処理済みとしてマークされたイベントのイベントハンドラーを追加できます。
myListBox.AddHandler(UIElement.MouseDownEvent,
new MouseButtonEventHandler(ListBox_MouseDown), true);
上記の3番目のパラメーターはhandledEventsToo
です。このハンドラーは、既にHandled
(ListBoxでListBoxItem
としてマークされている)としてマークされているかどうかに関係なく呼び出されます。
詳細については、 ルーティングイベントの処理済みとしてのマーク付け、およびクラス処理 を参照してください。
たとえば、 ListBoxのMouseDownイベントにアタッチする方法 を参照してください。
SelectionChangedイベントのSelectionChangedEventArgs引数を使用して、AddedItemsおよびRemovedItemsを介して追加または削除されるアイテムを検索できます。通常は、最後にクリックされたアイテムのみが表示されます。
Event="MouseLeftButtonUp"
を使用できます"PreviewLeftButtonDown"
とは異なり、ListBoxItemも処理されます。