Silverlight中最干净的单击+双击处理?

Jos*_*osh 6 double-click silverlight-3.0

我一直在寻找各种处理双击的方法,然后作者对一些处理单击的代码进行了抨击.现在Silverlight 3中是否有一个标准,每个人都用它来处理单击和双击列表框?

Fla*_*DOA 10

如果使用Reactive Extensions(Rx)库,支持双击的代码要简单得多:

Observable.FromEvent<MouseButtonEventArgs>(myControl, "MouseLeftButtonDown").TimeInterval().Subscribe(evt =>
        {
            if (evt.Interval.TotalMilliseconds <= 300)
            {
                // Do something on double click
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这是错误的,虽然非常轻微.应检查Interval.TotalMilliseconds,因为如果只检查Interval.Milliseconds,则双击也将是2小时,3分钟和500毫秒. (2认同)

Pau*_*lly -1

这是我为控件实现的一个类,也是下面为树视图(Silverlight Toolkit)实现的第二个派生类。只需使用要检查双击的控件实例化它,并为 DoubleClicked 事件添加处理程序即可。它使用计时器来尝试模拟双击事件。如果您认为延迟效果更好,可以更改延迟。

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
Run Code Online (Sandbox Code Playgroud)

结束课程

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
Run Code Online (Sandbox Code Playgroud)

结束课程