しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

ListBox でダブルクリック

WPF の ListBox には Click/DoubleClick イベントが存在せず、MouseDoubleClick などしか存在していません。

MouseDoubleClick を使えばいいと思いますが、これだと項目以外の場所をダブルクリックしたときにもイベントが呼ばれてしまいます。
検索すると

The resource cannot be found.

を見つけましたが、ループで親を辿るというのがあまりいい気分しなかったので、別のアプローチを考えてみました。

void lbi_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    // listBox は ListBox のインスタンス
    object item = listBox.SelectedItem;
    if (item == null)
    {
        // 選択されてない = ダブルクリックもされてないと考える
        return;
    }
    UIElement element = (UIElement)listBox.ItemContainerGenerator.ContainerFromItem(item);
    if (element.InputHitTest(e.GetPosition(element)) == null)
    {
        // ダブルクリックされた IInputElement がない = 別の場所がダブルクリックされた
        return;
    }
    // item がダブルクリックされた
}

シングルセレクト限定で、ListBox.Items に ListBoxItem を直接突っ込んでいる場合はどうなるか分かりません。しかし手元では動作していて、フォーラムに上がっていたものよりコンパクトなのでよしとしておきます。