2

問題:

リストビューに項目ソースを入力すると、項目はもはやListViewItemクラス/構造体またはあなたが使用したものにはなりません。イベント.ItemsSourceで「.IsMouseOver」プロパティを使用できないことを意味しますPreviewMouseMove

私は何を試しましたか?

  1. ListViewItemを aにキャストし、そのListViewItem上で .IsMouseOver を呼び出します (何も下線を引くことはありませんが、マウスをリスト ビューの上に置くと実行時にクラッシュし、「ClassName を にキャストできません」と表示されますListViewItem) 。
  2. クラスを IInputElement から継承させようとしましたが、 public ClassName : IInputElementそれが可能かどうかはわかりません。うまくいかなかったと言うと、それが見つからないと言われました。 .IsMouseOver に表示される要素。
  3. ListViewItemクラスを次のように継承させてみましたpublic ClassName : ListViewItemこれはうまくいきました! しかし、ListViewItem にはプロパティが含まれていない.IsMouseOverため、<.< をクラッシュさせずにクラスを ListViewItem にキャストすることはできません。

全体的な目標は、リスト項目を強調表示し、マウスが置かれているクラスの値を多数のテキスト フィールドに入力することです。以前に winforms でこれを行ったことがありますが、winforms では非常に簡単です。

4

2 に答える 2

3

コントロールを論理オブジェクトにバインドする必要があります。SelectedItem プロパティは ListViewItem ではありませんが、ビジュアル ツリーには引き続き含まれます。マウスが置かれている項目に対して、VisualTreeHelper と HitTest を使用します。アイテムを取得したら、バインドされたアイテムの DataContext プロパティを調べます。

ここにいくつかのコードがあります:

private ListViewItem FindListViewItem(DragEventArgs e)
{
    var visualHitTest = VisualTreeHelper.HitTest(_listView, e.GetPosition(_listView)).VisualHit;

    ListViewItem listViewItem = null;

    while (visualHitTest != null)
    {
        if (visualHitTest is ListViewItem)
        {
            listViewItem = visualHitTest as ListViewItem;

            break;
        }
        else if (visualHitTest == _listView)
        {
            Console.WriteLine("Found ListView instance");
            return null;
        }

        visualHitTest = VisualTreeHelper.GetParent(visualHitTest);
    }

    return listViewItem;
}

もう 1 つのオプションは、ItemsContainerStyle のスタイルを設定して、希望する方法で MouseOver を処理することです。

于 2012-10-19T15:11:13.520 に答える
1

実際には、ListView ItemsSource をバインドしても、ビジュアル ツリーには ListViewItems があります。これが、WPF がアイテム コンテナーと呼ぶものです (たとえば、ListBoxItem など)。

ListView にItemContainerGeneratorという名前のプロパティがあります。これにより、オブジェクトに関連付けられた ListViewItem を返すContainerFromItemというメソッドを持つ ItemContainerGenerator オブジェクトが返されます。

その後、アイテム コンテナー ジェネレーターのおかげで、取得したコンテナーで IsMouseOver を使用できます。

于 2012-10-19T15:09:03.507 に答える