Here is the class that I implemented for controls, as well as the second derived class below for the tree (Silverlight Toolkit). Simply create it using the control you want to check for double clicks and add a handler for the DoubleClicked event. It uses a timer to try to simulate a double-click event. You can change the delay if you think it will work better.
Public Class DoubleClickHelper Public Event DoubleClicked(ByVal sender As FrameworkElement) Private WithEvents UI As FrameworkElement Sub New(ByRef UI As FrameworkElement) Me.UI = UI UI.AddHandler(UIElement.MouseLeftButtonDownEvent, New MouseButtonEventHandler(AddressOf UI_MouseLeftButtonDown), True) InitTimer() End Sub Public Delay As Single = 0.2 Private _dblclick As Boolean = False Private _timer As New System.Windows.Threading.DispatcherTimer() Protected Property DoubleClick() As Boolean Get Return _dblclick End Get Set(ByVal value As Boolean) _dblclick = value InitTimer() End Set End Property Private Sub InitTimer() RemoveHandler _timer.Tick, AddressOf timer_Tick _timer.Stop() _timer = New System.Windows.Threading.DispatcherTimer() _timer.Interval = TimeSpan.FromSeconds(Delay) AddHandler _timer.Tick, AddressOf timer_Tick _timer.Start() End Sub Protected Overridable Sub timer_Tick(ByVal sender As Object, ByVal e As EventArgs) DoubleClick = False End Sub Protected Overridable Sub UI_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles UI.MouseLeftButtonDown If DoubleClick Then HandleDoubleClick(sender) Else HandleFirstClick(sender) End If End Sub Protected Overridable Sub HandleDoubleClick(ByVal sender As FrameworkElement) RaiseEvent DoubleClicked(sender) End Sub Protected Overridable Sub HandleFirstClick(ByVal sender As FrameworkElement) DoubleClick = True End Sub
Final class
Public Class TreeViewItemDoubleClickHelper Inherits DoubleClickHelper Private SameSelection As Boolean = False Private WithEvents TreeView As TreeView = Nothing Public Sub New(ByVal TreeView As TreeView) MyBase.New(TreeView) Me.TreeView = TreeView End Sub 'This event happens after MouseLeftButtonDown Private Sub TreeView_SelectedItemChanged(ByVal sender As Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of Object)) Handles TreeView.SelectedItemChanged SameSelection = e.OldValue Is e.NewValue End Sub Protected Overrides Sub UI_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) 'MyBase.UI_MouseLeftButtonDown(sender, e) If DoubleClick Or SameSelection Then HandleDoubleClick(sender) SameSelection = False DoubleClick = False Else HandleFirstClick(sender) End If End Sub
Final class
Paully
source share