4

以下を実行すると、私の問題が再現されます。

  • 新しいWPFプロジェクト
  • ListViewを追加します
  • リストビューに名前を付けます:x:Name = "lvList"
  • 実行時に垂直スクロールバーが表示されるように、リストを完全に埋めるのに十分なListViewItemをListViewに追加します。
  • このコードをlvList.MouseDoubleClickイベントに入れます

Debug.Print( "ダブルクリックが発生しました")

  • アプリケーションを実行する
  • スクロールバーのLargeChange領域をダブルクリックします(スクロール「バー」自体ではありません)
  • ListViewのダブルクリックが発生したメッセージを印刷するイミディエイトウィンドウに注目してください

この動作を変更して、マウスがListViewItemsの上にあるときにのみ発生し、ScrollViewerをクリックしてリストを上下にスクロールするときは発生しないようにするにはどうすればよいですか?

4

4 に答える 4

5

MouseDoubleClick ハンドラーは ListView コントロールにアタッチされているため、動作を変更することはできません。そのため、ListView がクリックされるたびに、どこでも発生する必要があります。ListView のどの要素が最初にダブルクリックを検出したかを検出し、そこからそれが ListViewItem であったかどうかを判断します。簡単な例を次に示します (エラー チェックは省略しています)。

private void lv_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
  DependencyObject src = (DependencyObject)(e.OriginalSource);
  while (!(src is Control))
    src = VisualTreeHelper.GetParent(src);
  Debug.WriteLine("*** Double clicked on a " + src.GetType().Name);
}

ダブルクリックされた実際の要素を見つけるために e.OriginalSource を使用していることに注意してください。通常、これは Rectangle や TextBlock のような非常に低レベルのものになるため、VisualTreeHelper を使用して含まれているコントロールに移動します。私の些細な例では、ヒットした最初のコントロールが ListViewItem になると仮定しましたが、テキスト ボックスやチェック ボックスなどを含む CellTemplates を扱っている場合はそうではないかもしれません。ただし、ListViewItems のみを検索するようにテストを簡単に調整できますが、その場合、クリックが ListViewItem の外側にあり、検索が最終的に ListView 自体にヒットする場合を処理することを忘れないでください。

于 2010-03-20T23:05:45.490 に答える
1

多分これは役立ちますか?

Private Sub LstView_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles LstView.MouseDoubleClick
    Dim source As FrameworkElement = TryCast(e.OriginalSource, FrameworkElement)
    If IsNothing(source) Then Return

    Dim TmplParent As DependencyObject = TryCast(source.TemplatedParent, DependencyObject)
    If IsNothing(TmplParent) Then Return
    If Not TmplParent.GetType.Equals(GetType(System.Windows.Controls.ListViewItem)) Then e.Handled = True
End Sub
于 2011-04-14T06:14:24.420 に答える
0

これが機能するかどうかをテストするのに便利なVSはありませんが、ListView自体ではなく、ListViewItemsでダブルクリックイベントを処理しようとしましたか?

<ListView ListViewItem.MouseDoubleClick="lv_MouseDoubleClick" ... />

これにより、ListView 内のすべての子 ListViewItem コントロールで MouseDoubleClick イベントが処理されます。動作するかどうかお知らせください!

于 2010-03-20T23:16:09.900 に答える
0
  <Style TargetType="{x:Type ListViewItem}">           
            <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
        </Style>

このスタイルを適用すると、うまくいきます。リストビューのアイテムをダブルクリックするだけで機能します。

また、リストビューからダブルクリックを削除する必要があります。

于 2013-06-26T10:12:34.363 に答える