2009-06-30 23 views
9

Tôi muốn có thể nắm bắt các sự kiện DoubleClick hoặc MouseDoubleClick từ nút radio winforms tiêu chuẩn, nhưng chúng dường như bị ẩn và không hoạt động. Hiện tại tôi có mã như sau:Làm cách nào để nhận sự kiện DoubleClick trong nút radio .NET?

public class RadioButtonWithDoubleClick : RadioButton 
{ 
    public RadioButtonWithDoubleClick() 
     : base() 
    { 
     this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true); 
    } 

    [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 
    public new event MouseEventHandler MouseDoubleClick; 
    protected override void OnMouseDoubleClick(MouseEventArgs e) 
    { 
     MouseEventHandler temp = MouseDoubleClick; 
     if(temp != null) { 
      temp(this, e); 
     } 
    } 
} 

Có cách nào đơn giản và rõ ràng hơn để làm điều đó?

Chỉnh sửa: Đối với nền, tôi đồng ý với bài đăng của Raymond Chen here rằng khả năng nhấp đúp vào nút radio (nếu đó là chỉ điều khiển trên hộp thoại) làm cho hộp thoại dễ sử dụng hơn một chút những người biết về nó.

Trong Vista sử dụng Hộp thoại nhiệm vụ (xem this Microsoft guideline page hoặc this MSDN page specifically about the Task Dialog API) sẽ là giải pháp hiển nhiên, nhưng chúng tôi không có sự sang trọng của điều đó.

Trả lời

10

Dựa trên đề xuất ban đầu của bạn đã thực hiện giải pháp mà không cần phân lớp radiobuton bằng cách sử dụng phản chiếu:

MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic); 
if (m != null) 
{ 
    m.Invoke(radioButton1, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true }); 
} 
radioButton1.MouseDoubleClick += radioButton1_MouseDoubleClick; 

Bây giờ, sự kiện nhấp đúp cho nút vô tuyến được kích hoạt. BTW: Đề xuất của Nate sử dụng e.Clicks không hoạt động. Trong các bài kiểm tra của tôi, e.Clicks luôn luôn là 1 cho dù tôi có bấm nút radio nhanh hay thường xuyên hay không.

3

Bạn có thể làm một cái gì đó như thế này:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick); 

void myRadioButton_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Clicks == 2) 
    { 
     // Do something 
    } 
} 

Bạn có thể hoặc không còn muốn kiểm tra xem e.Button == MouseButtons.Left

+0

Tôi chấp nhận thế này, bởi vì mặc dù tôi nghĩ rằng giải pháp của riêng tôi đơn giản hơn cho trường hợp của tôi, nơi mà tôi sẽ sử dụng cùng một điều khiển nhiều lần, nếu ai đó chỉ muốn một hoặc hai lần thì bạn sẽ đơn giản hơn nhiều. – Ant

+2

Điều này dường như không hoạt động trên .NET 3.5 vì Clicks == 2 không bao giờ xảy ra. – Wernight

+0

Điều này cũng không xảy ra trong .NET 4.0, vì vậy tôi đang chuyển câu trả lời được chấp nhận cho câu trả lời được chấp nhận bởi MSW. – Ant

0

Xin lỗi, không có danh tiếng để bình luận về điều này. Bạn đang cố gắng thực hiện hành động nào để thực hiện nhấp đúp cho người dùng? Tôi nghĩ việc sử dụng nhấp đúp có thể gây nhầm lẫn vì nó khác với mô hình tinh thần chung mà người dùng có nút radio (nhấp chuột một lần, chọn một tùy chọn từ một bộ)

+0

Điểm tốt. Tôi sẽ cập nhật câu hỏi – Ant

+0

Ah, tôi hiểu. Bạn đang sử dụng nhấp đúp làm phím tắt để chọn + tiếp theo. Điều đó có ý nghĩa. Tôi nghĩ rằng mã bạn trình bày là cách sạch nhất để đi về điều này. Có vẻ như đây là chức năng mà MS cố tình chôn vùi cho radio. – Ehz

+0

Đó là những gì tôi đã tìm :(Cảm ơn phản hồi. – Ant

1

Dựa trên câu trả lời @MSW, tôi làm lớp mở rộng này:

static class RadioButtonEx 
{ 
    public static void AllowDoubleClick(this RadioButton rb, MouseEventHandler MouseDoubleClick) 
    { 
     // 
     // Allow double clicking of radios 
     System.Reflection.MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
     if (m != null) 
      m.Invoke(rb, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true }); 

     rb.MouseDoubleClick += MouseDoubleClick; 
    } 
} 

Đó là sau đó siêu dễ dàng để thiết lập và tái sử dụng:

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction()); 
Các vấn đề liên quan