質問

非常に具体的な理由で選択したいのですが、 ListViewItem実際にはマウスボタンを押したときではなく、マウスボタンを押したときです。この動作をコントロールに埋め込みたいと考えています。これを達成することは可能でしょうか?誰かヒントを与えることができますか?

役に立ちましたか?

解決

Aviad P. の答えは良いもので、添付プロパティを賢く利用していますが、私はほとんどの場合、別のテクニックを使用する傾向があります。

  1. ListViewItem のサブクラス。
  2. 何もしないように OnMouseLeftButtonDown と OnMouseRightButton をオーバーライドします。
  3. OnMouseLeftButtonUp / OnMouseRightButtonUp をオーバーライドして、base.OnMouseLeftButtonDown /base.OnMouseRightButtonDown を呼び出します。
  4. ListView のサブクラス。
  5. 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)を行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top