2012-03-19 27 views
8

Tôi tạo ra hành vi cho DataGrid để phát hiện kích đúp vào:Silverlight 5 nhấp đúp luôn trả ClickCount như 1

public class DataGridDoubleClickBehavior : Behavior<DataGrid>  
    { 
     public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(
      "CommandParameter", 
      typeof(object), 
      typeof(DataGridDoubleClickBehavior), 
      new PropertyMetadata(null));   

     public object CommandParameter 
     { 
      get { return GetValue(CommandParameterProperty); }    
      set { SetValue(CommandParameterProperty, value); } 
     } 

     public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register(
      "DoubleClickCommand", 
      typeof(ICommand), 
      typeof(DataGridDoubleClickBehavior), 
      new PropertyMetadata(null));  

     public ICommand DoubleClickCommand 
     { 
      get { return (ICommand)GetValue(DoubleClickCommandProperty); }    
      set { SetValue(DoubleClickCommandProperty, value); } 
     } 

     protected override void OnAttached() 
     { 
      this.AssociatedObject.LoadingRow += this.OnLoadingRow; 
      this.AssociatedObject.UnloadingRow += this.OnUnloadingRow; 

      base.OnAttached(); 
     } 

     protected override void OnDetaching() 
     { 
      this.AssociatedObject.LoadingRow -= this.OnLoadingRow; 
      this.AssociatedObject.UnloadingRow -= this.OnUnloadingRow; 

      base.OnDetaching(); 
     } 

     private void OnLoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      e.Row.MouseLeftButtonUp += this.OnMouseLeftButtonUp; 
     } 

     private void OnUnloadingRow(object sender, DataGridRowEventArgs e) 
     { 
      e.Row.MouseLeftButtonUp -= this.OnMouseLeftButtonUp; 
     } 

     private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      if (e.ClickCount < 2) return; 

      if (this.DoubleClickCommand != null) this.DoubleClickCommand.Execute(this.CommandParameter); 
     } 
    } 

Tất cả mọi thứ có vẻ là tốt ngoại trừ việc nó không ghi lại nhiều lần bấm chuột. Trong OnMouseLeftButtonUp ClickCount luôn luôn 1. Không ai biết tại sao?

+0

Là một vài kiểm tra tính chính xác, có thể chạy mẫu của Pete để xác thực rằng nó hoạt động và/hoặc chạy một trong các dự án SL4 DataGrid + DoubleClick hiện có như http://www.codeproject.com/Articles/115405/Double-Click -DataGrid-in-Silverlight? –

+0

Những gì tôi đang làm là một phần của bản nâng cấp SL5. Loại bỏ mã như thế vì đa nhấp chuột thực sự "được hỗ trợ" ... Tôi có mã hoạt động. Tôi chỉ muốn làm cho nó đúng. – katit

Trả lời

3

Vâng, những rắc rối lớn hơn ở đây là khi bạn click vào các hàng của một DataGrid , MouseLeftButtonDown không được nâng lên, vì nhấp chuột này đang được xử lý ở cấp hàng.

Tôi đã từ bỏ việc xử lý trực tiếp một số điều khiển. Tôi đã có phiên bản riêng của tôi về DataGrid, DataForm và vv Điều này chỉ làm cho giải pháp của tôi dễ dàng tung ra, bởi vì tôi không sử dụng các phiên bản vani anyway.

Tôi đã thêm một sự kiện mới có tên là ClickIncludingHandled, nó hơi giống một chút nhưng mô tả chính xác những gì đang diễn ra và sẽ xuất hiện ngay bên dưới Nhấp với IntelliSense - nếu điều khiển có sự kiện Nhấp để bắt đầu.

Dù sao, dưới đây là việc triển khai của tôi. Sau đó, bạn có thể đăng ký sự kiện này và sử dụng ClickCount để xác định số nhấp chuột bạn muốn nắm bắt. Tôi nhận thấy nó hơi chậm, nhưng nó hoạt động một cách rõ ràng.

public partial class DataGridBase : DataGrid 
{ 
     public event MouseButtonEventHandler ClickIncludingHandled; 

     public DataGridBase() : base() 
     { 
      this.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(OnClickInclHandled), true); 
     } 

     private void OnClickInclHandled(object sender, MouseButtonEventArgs e) 
     { 
      if (ClickIncludingHandled != null) 
      { 
       ClickIncludingHandled(sender, e); 
      } 
     } 
} 
0

Tôi đã gặp sự cố tương tự chính xác này. Tôi không thể xoay sở để giải quyết nó theo bất kỳ cách nào hợp lý, do đó, làm việc xung quanh nó như thế này:

private DateTime _lastClickTime; 
    private WeakReference _lastSender; 

    private void Row_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     var now = DateTime.Now; 
     if ((now - _lastClickTime).TotalMilliseconds < 200 && _lastSender != null && _lastSender.IsAlive && _lastSender.Target == sender) 
     { 
      if (Command != null) 
      { 
       Command.Execute(CommandParameter); 
      } 
     } 
     _lastClickTime = now; 
     _lastSender = new WeakReference(sender); 
    } 

Nó bẩn nhưng nó hoạt động.

+0

Về mặt kỹ thuật, nên sử dụng SystemInformation.DoubleClickTime và kiểm tra xem mỗi nhấp chuột có nằm trong SystemInformation.DoubleClickSize – EricLaw

+0

Lớp SystemInformation nằm trong System.Windows.Forms và do đó không có sẵn trong Silverlight. –

1

MouseButtonUp bị hỏng liên quan đến việc chụp ClickCount trong WPF và Silverlight (nó đã được ghi lại nhiều lần nhưng Microsoft đã chọn không sửa lỗi). Bạn cần sử dụng các sự kiện MouseButtonDown.

11

Tôi đã tìm thấy một giải pháp rất đơn giản. Chỉ cần thay thế các cú pháp đăng ký xử lý sự kiện

myDataGrid.MouseLeftButtonDown += this.MyDataGrid_MouseLeftButtonDown; 

với AddHandler cú pháp

myDataGrid.AddHandler(DataGrid.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(this.MyDataGrid_MouseLeftButtonDown), 
    handledEventsToo: true) 

Bằng cách đó sự kỳ diệu boolean handledEventsToo đối số có thể được xác định.

Điều này cũng sẽ xử lý các sự kiện được xử lý.

+0

Điều này làm việc độc đáo :-) Sau đó sử dụng các công cụ tương tác để có được sự kiện lên đến máy ảo và bạn đang vàng –

+0

Làm việc cho tôi và đưa ra +1. Bạn không cần phải có 'handlingEventsToo:' trong đó, nhưng tôi đoán nó không làm hại gì cả. – McAden

+1

thực tiễn tốt cho các cuộc gọi phương thức khi các đối số được chỉ định bằng các chữ như * true * hoặc * 42 * thay vì các biến mô tả. Làm cho mã dễ đọc hơn. – herzmeister

Các vấn đề liên quan