WPFリストビューの変更
-
20-09-2019 - |
質問
非常に具体的な理由で選択したいのですが、 ListViewItem
実際にはマウスボタンを押したときではなく、マウスボタンを押したときです。この動作をコントロールに埋め込みたいと考えています。これを達成することは可能でしょうか?誰かヒントを与えることができますか?
解決
Aviad P. の答えは良いもので、添付プロパティを賢く利用していますが、私はほとんどの場合、別のテクニックを使用する傾向があります。
- ListViewItem のサブクラス。
- 何もしないように OnMouseLeftButtonDown と OnMouseRightButton をオーバーライドします。
- OnMouseLeftButtonUp / OnMouseRightButtonUp をオーバーライドして、base.OnMouseLeftButtonDown /base.OnMouseRightButtonDown を呼び出します。
- ListView のサブクラス。
- GetContainerForItemOverride() をオーバーライドして ListViewItem オーバーライドを返します
これは、ItemContainer イベントをサブスクライブしてハンドラーを動的に追加するよりも簡単に思えます。
これは次のようになります。
public class MouseUpListViewItem : ListViewItem
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
}
protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)
{
base.OnMouseRightButtonDown(e);
}
}
public class MouseUpListView : ListView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new MouseUpListViewItem();
}
}
この手法は、必要なコードが少なくて済むので気に入っています。
他のヒント
はい、それは添付プロパティを使用して、間違いなく可能です。 SelectOnMouseUp
と呼ばれる添付プロパティを定義し、それがtrueに設定されていますとき、新しい項目のコンテナが追加されたときに発見するためにあなたのItemsContainerGenerator
イベントにフックします。新しいアイテムコンテナのイベントを取得するときに、そのPreviewMouseDown
にフックし、それ(trueに設定e.Handled
)を無視し、そのMouseUp
イベントにフックし、選択(IsSelected
するセットtrue
)を行います。
所属していません StackOverflow