トップ回答者
WPF WrapPanelのダブルクリックイベントを発生させたい

質問
-
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)
回答
-
ListBox全体じゃなくてListBoxItem全体ですし、その「奇妙な例外」というのを解消したほうが真っ当そうですが……まあそれはそれとして。
ListBoxItem_user30のMouseLeftButtonDownイベントにて、e.ClickCountが2のときに該当処理を書く、というのでいいんじゃないでしょうか。
- 回答としてマーク huahi11112 2018年5月17日 6:36
すべての返信
-
まず、ダブルクリックの範囲は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
-
ListBox全体じゃなくてListBoxItem全体ですし、その「奇妙な例外」というのを解消したほうが真っ当そうですが……まあそれはそれとして。
ListBoxItem_user30のMouseLeftButtonDownイベントにて、e.ClickCountが2のときに該当処理を書く、というのでいいんじゃないでしょうか。
- 回答としてマーク huahi11112 2018年5月17日 6:36
-
御回答ありがとうございました。解決できましたのでお知らせします。
まず、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イベントを拾うことはやめたという次第です。
すぐに回答していただき、誠にありがとうございました。