none
WPF WrapPanelのダブルクリックイベントを発生させたい RRS feed

  • 質問

  • ListBoxに、WrapPanelを継承したクラスを要素として追加していますが、WrapPanelはMouseDoubleClickイベントを発生できないので困っています。

    WrapPanelをダブルクリックしてイベントを発生させるプログラムを無理にでも組むことはできないものでしょうか。


    ’●この様な要素をListBoxに追加する

    Public Class ListBoxItem_user30
        Inherits WrapPanel

        Public Sub New(ByVal _c1 As String, ByVal _c2 As String)

            Dim lb1, lb2 As New System.Windows.Controls.Label
            Me.Height = 28
            Me.MaxWidth = 300

            lb1.Width = 60
            lb2.Width = 240
            lb1.Content = _c1
            lb2.Content = _c2
            Me.Children.Add(lb1)
            Me.Children.Add(lb2)

        End Sub
    End Class

    ’●ListBox1への追加
       Dim l3 As New ListBoxItem_user30("001", "999")
            Me.ListBox1.Items.Add(l3)
    2018年5月17日 3:13

回答

  • ListBox全体じゃなくてListBoxItem全体ですし、その「奇妙な例外」というのを解消したほうが真っ当そうですが……まあそれはそれとして。

    ListBoxItem_user30のMouseLeftButtonDownイベントにて、e.ClickCountが2のときに該当処理を書く、というのでいいんじゃないでしょうか。

    • 回答としてマーク huahi11112 2018年5月17日 6:36
    2018年5月17日 4:07

すべての返信

  • まず、ダブルクリックの範囲はWrapPanelのみなのでしょうか、それともListBoxのアイテム全体でしょうか。

    (WrapPanelのBackgroundに適当なブラシを設定すれば、WrapPanelの部分とListBoxのアイテムの範囲の違いが視覚的にわかります)

    ListBoxItem全体でいいのであれば、

    <ListBox>
      <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
          <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>

    という感じに書けば、Windowの方の.vbでイベントハンドラを記述できますが

    • 編集済み Hongliang 2018年5月17日 3:29
    2018年5月17日 3:29
  • 御回答ありがとうございます。

    ダブルクリックの範囲はWrapPanelのみです。

    ListBox全体に対してダブルクリックイベントを拾おうとしたところ、今までに見たことも無い奇妙な例外が発生したので、やめました。

    2018年5月17日 3:51
  • ListBox全体じゃなくてListBoxItem全体ですし、その「奇妙な例外」というのを解消したほうが真っ当そうですが……まあそれはそれとして。

    ListBoxItem_user30のMouseLeftButtonDownイベントにて、e.ClickCountが2のときに該当処理を書く、というのでいいんじゃないでしょうか。

    • 回答としてマーク huahi11112 2018年5月17日 6:36
    2018年5月17日 4:07
  • 御回答ありがとうございました。解決できましたのでお知らせします。

    まず、MouseButtonEventArgs.ClickCountを読んでダブルクリックかどうかを判断することはできませんでした。

    「MouseButtonEventArgs.ClickCount プロパティ」
    ↓このサンプルプログラムは、動きませんでした。信用できません。
    どのようなクリックをしてもClickCount=1にしかなりませんでした。
    https://msdn.microsoft.com/ja-jp/library/system.windows.input.mousebuttoneventargs.clickcount(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

    結局、System.Timers.timerクラスで一定時間のインターバルを作り、その中でMouseLeftButtonDownイベントの2度目を捉えたらダブルクリックと判定しました。

    ------
    ListBox要素のダブルクリックをListBox.MouseDoubleClickで判断させた時の例外とは、もうプログラムを削除してしまったので再現できませんが、「~の論理観に誤りがあります」という様な内容のものでした。プログラムを限り無く簡略化して発生原因を突き止めましたが、全く原因が分かりませんでした。恐らく、このフォーラムで質問しても回答が付かないでしょう。そのリスクを考えてListBox全体に対してMouseDoubleClickイベントを拾うことはやめたという次第です。

    すぐに回答していただき、誠にありがとうございました。
    2018年5月17日 6:49