Самое чистое одиночное нажатие + обработка двойного щелчка в Silverlight?

Общие решения .

Просто, потому что данный шаблон/технология работает лучше при одном обстоятельстве, не означают, что это делает в другом.

злоупотребление StringBuilder в .NET является частым примером этого.

6
задан Josh 13 August 2009 в 20:27
поделиться

2 ответа

Вот класс, который я реализовал для элементов управления, а также второй производный класс ниже для древовидного представления (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

Конечный класс

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

Конечный класс

-1
ответ дан 9 December 2019 в 20:46
поделиться

Если вы используете продление реактивных расширений (RX) библиотеку код для поддержки двойного щелчка, намного проще:

Observable.FromEvent<MouseButtonEventArgs>(myControl, "MouseLeftButtonDown").TimeInterval().Subscribe(evt =>
        {
            if (evt.Interval.TotalMilliseconds <= 300)
            {
                // Do something on double click
            }
        });
10
ответ дан 9 December 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: