1


1

WPFリストビューの変更

非常に特定の理由で、実際にはマウスボタンを押し下げたときではなく、マウスボタンを押し上げたときにListViewItemを選択します。 この動作をコントロールに埋め込む必要があります。 これを達成することは可能ですか? 誰もがヒントを与えることができますか?

2 回答


3


はい、添付プロパティを使用して間違いなく可能です。 「SelectOnMouseUp」という名前の添付プロパティを定義し、trueに設定されている場合は、「ItemsContainerGenerator」イベントにフックして、新しいアイテムコンテナが追加されたことを検出します。 次に、新しいアイテムコンテナのイベントを取得したら、「PreviewMouseDown」にフックして無視し(「e.Handled」をtrueに設定)、「MouseUp」イベントにフックして選択を実行します(「IsSelected」を「true」)。


2


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();
  }
}

必要なコードが少ないため、この手法が気に入っています。