Created
November 18, 2010 10:16
-
-
Save vcaraulean/704830 to your computer and use it in GitHub Desktop.
Mouse Double Click event implementation for Silverlight and Caliburn.Micro
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class DoubleClickEvent | |
{ | |
public static readonly DependencyProperty AttachActionProperty = | |
DependencyProperty.RegisterAttached( | |
"AttachAction", | |
typeof (string), | |
typeof (DoubleClickEvent), | |
new PropertyMetadata(OnAttachActionChanged)); | |
public static void SetAttachAction(DependencyObject d, string attachText) | |
{ | |
d.SetValue(AttachActionProperty, attachText); | |
} | |
public static string GetAttachAction(DependencyObject d) | |
{ | |
return d.GetValue(AttachActionProperty) as string; | |
} | |
private static void OnAttachActionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
{ | |
if (e.NewValue == e.OldValue) | |
return; | |
var text = e.NewValue as string; | |
if (string.IsNullOrEmpty(text)) | |
return; | |
AttachActionToTarget(text, d); | |
} | |
private static void AttachActionToTarget(string text, DependencyObject d) | |
{ | |
var actionMessage = Parser.CreateMessage(d, text); | |
var trigger = new ConditionalEventTrigger | |
{ | |
EventName = "MouseLeftButtonUp", | |
Condition = e => DoubleClickCatcher.IsDoubleClick(d, e) | |
}; | |
trigger.Actions.Add(actionMessage); | |
Interaction.GetTriggers(d).Add(trigger); | |
} | |
public class ConditionalEventTrigger : EventTrigger | |
{ | |
public Func<EventArgs, bool> Condition { get; set; } | |
protected override void OnEvent(EventArgs eventArgs) | |
{ | |
if (Condition(eventArgs)) | |
base.OnEvent(eventArgs); | |
} | |
} | |
static class DoubleClickCatcher | |
{ | |
private const int DoubleClickSpeed = 400; | |
private const int AllowedPositionDelta = 6; | |
static Point clickPosition; | |
private static DateTime lastClick = DateTime.Now; | |
private static bool firstClickDone; | |
internal static bool IsDoubleClick(object sender, EventArgs args) | |
{ | |
var element = sender as UIElement; | |
var clickTime = DateTime.Now; | |
var e = args as MouseEventArgs; | |
if (e == null) | |
throw new ArgumentException("MouseEventArgs expected"); | |
var span = clickTime - lastClick; | |
if (span.TotalMilliseconds > DoubleClickSpeed || firstClickDone == false) | |
{ | |
clickPosition = e.GetPosition(element); | |
firstClickDone = true; | |
lastClick = DateTime.Now; | |
return false; | |
} | |
firstClickDone = false; | |
var position = e.GetPosition(element); | |
if (Math.Abs(clickPosition.X - position.X) < AllowedPositionDelta && | |
Math.Abs(clickPosition.Y - position.Y) < AllowedPositionDelta) | |
return true; | |
return false; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// How to use it in a list box: | |
<ListBox> | |
<ListBox.ItemTemplate> | |
<DataTemplate> | |
<Grid> | |
<TextBlock Text="{Binding Name}" | |
Behaviors:DoubleClickEvent.AttachAction="Open($datacontext)"> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A bit more detailed description and usage example are in my blog post