MouseDoubleClickCommand.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Threading;
  3. namespace FWindSoft.MVVM
  4. {
  5. public class MouseDoubleClickCommand : BaseCommand
  6. {
  7. private int m_Interval;
  8. private object m_PreviousParam;
  9. private readonly object o = new object();
  10. private Timer m_Tirmer;
  11. public MouseDoubleClickCommand(Action<object> execute, Predicate<object> canExecute)
  12. : base(execute, canExecute)
  13. {
  14. m_Interval = 500;
  15. this.m_Tirmer=new Timer(Callback,o,int.MaxValue,this.m_Interval);
  16. }
  17. public MouseDoubleClickCommand(Action<object> execute, Predicate<object> canExecute, int interval)
  18. : base(execute, canExecute)
  19. {
  20. m_Interval = interval;
  21. this.m_Tirmer = new Timer(Callback, o, int.MaxValue, this.m_Interval);
  22. }
  23. private void Callback(object ob)
  24. {
  25. lock (o)
  26. {
  27. this.m_PreviousParam = null;
  28. this.m_Tirmer.Change(int.MaxValue, this.m_Interval);
  29. }
  30. }
  31. public override void Execute(object parameter)
  32. {
  33. if (m_PreviousParam == null)
  34. {
  35. m_PreviousParam = parameter;
  36. this.m_Tirmer.Change(this.m_Interval, this.m_Interval);
  37. return;
  38. }
  39. else
  40. {
  41. lock (o)
  42. {
  43. if (m_PreviousParam != null && m_PreviousParam.Equals(parameter))
  44. {
  45. base.Execute(parameter);
  46. this.m_PreviousParam = null;
  47. this.m_Tirmer.Change(int.MaxValue, this.m_Interval);
  48. }
  49. else
  50. {
  51. m_PreviousParam = parameter;
  52. this.m_Tirmer.Change(this.m_Interval, this.m_Interval);
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }