2008-10-07 6 views
5

मेरे पास एक सी # फॉर्म है (चलिए इसे मेनफॉर्म कहते हैं) इसके साथ कई कस्टम नियंत्रण हैं। मैं मेनफॉर्म.ऑनक्लिक() विधि आग को किसी भी समय फॉर्म पर क्लिक करता हूं चाहे इस पर क्लिक किया गया हो या क्लिक पर कस्टम नियंत्रण में से एक पर क्लिक किया गया हो। मैं प्रमुख प्रेस के बजाए माउस क्लिक को छोड़कर फ़ॉर्म की कीप्रेव्यू सुविधा के समान व्यवहार की तलाश में हूं।मैं एक फॉर्म के लिए एक क्लिक इवेंट कैसे सेट करूं?

उत्तर

2

प्रपत्र के नियंत्रण में ईवेंट में, फॉर्म के क्लिक ईवेंट के पते के साथ, नियंत्रण में माउसक्लिक हैंडलर जोड़ें। मैंने इसका परीक्षण नहीं किया है, लेकिन यह काम कर सकता है।

Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded 

    AddHandler e.Control.MouseClick, AddressOf Example_MouseClick 
End Sub 

Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick 
    MessageBox.Show("Click") 
End Sub 
+0

यह अभी भी एक हैक का थोड़ा सा प्रतीत होता है लेकिन यह मेरे पास सबसे अच्छा विकल्प प्रतीत होता है। – Mykroft

0

फ़ॉर्म पर खुली जगह पर क्लिक को पकड़ना आसान है, लेकिन वास्तव में एक नियंत्रण पर क्लिक करने के लिए, आपको उस नियंत्रण को उस फ़ॉर्म को भेजने के लिए आवश्यकता होगी।

एक संभावना है कि पूरे फॉर्म पर एक पारदर्शी नियंत्रण रखें, और उस पर क्लिक स्वीकार करें, उनके साथ सौदा करें, और फिर उन्हें नीचे उचित नियंत्रण में पास करें।

+0

मुझे लगता है कि इससे कहीं अधिक सुरुचिपूर्ण समाधान होना चाहिए। – Mykroft

0

यह विकास में एक आम पैटर्न है, इसे ऑब्जर्वर पैटर्न कहा जाता है। ऑब्जर्वर पैटर्न के बहुत सारे उदाहरण हैं और सी # यहां 1 उदाहरण http://msdn.microsoft.com/en-us/library/ms954621.aspx है लेकिन इसके पास एक अच्छा Google है।

1

एकमात्र तरीका मैंने कभी ऐसा करने में कामयाब रहा है [सी] क्लिक [/ c] प्रत्येक नियंत्रण की घटना को संभालने के लिए। मुझे विश्वास नहीं है कि नियंत्रण प्रक्रियाओं से पहले घटना को उठाया गया है।

डब्ल्यूपीएफ में, "सुरंग" पूर्वावलोकन घटनाएं हैं जो इस कार्यक्षमता प्रदान करती हैं, लेकिन यह वास्तव में WinForms में आपकी सहायता नहीं करती है।

+0

वैसे अब डब्लूपीएफ पर स्विच करने में बहुत देर हो चुकी है, लेकिन मुझे लगता है कि मुझे भविष्य में इसका उपयोग करने पर गंभीरता से विचार करना होगा। – Mykroft

1

यदि आप चाहें तो आप सभी नियंत्रण की घटनाओं को हुक कर सकते हैं और फिर उस तरह की निगरानी कर सकते हैं। मुझे लगता है कि उन सभी को फंसाने के लिए कुछ उबर फैंसी Win32 एपीआई तरीका है, लेकिन यह इस समय मेरे बाहर है।

14:51:42.3381985 MouseClick (Form1) 
14:51:40.6194485 MouseClick (RichTextBox) 
14:51:40.0100735 MouseClick (TextBox) 
14:51:39.6194485 MouseClick (Form1) 
14:51:39.2131985 MouseClick (RichTextBox) 
14:51:38.8694485 MouseClick (Button) 

HTH:

public Form1() 
    { 
     InitializeComponent(); 
     HookEvents(); 
    } 

    private void HookEvents() { 
     foreach (Control ctl in this.Controls) { 
      ctl.MouseClick += new MouseEventHandler(Form1_MouseClick); 
     } 
    } 

    void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     LogEvent(sender, "MouseClick"); 
    } 

    // and then this just logs to a multiline textbox you have somwhere on the form 
    private void LogEvent(object sender, string msg) { 
     this.textBox1.Text = string.Format("{0} {1} ({2}) \n {3}", 
      DateTime.Now.TimeOfDay.ToString(), 
      msg, 
      sender.GetType().Name, 
      textBox1.Text 
      ); 
    } 

उत्पादन कुछ इस तरह, सभी घटनाओं और जो उन्हें "भेजा" को दिखा रहा है।

6

मैं आपके आवेदन के अन्य रूपों के उत्तराधिकारी के लिए आधार फॉर्म बनाने की अनुशंसा करता हूं। GlobalMouseClickEventHandler नामक एक नई घटना बनाने के लिए अपने आधार फार्म के लिए इस कोड जोड़ें:

namespace Temp 
{ 
    public delegate void GlobalMouseClickEventHander(object sender, MouseEventArgs e); 

    public partial class TestForm : Form 
    { 
     [Category("Action")] 
     [Description("Fires when any control on the form is clicked.")] 
     public event GlobalMouseClickEventHander GlobalMouseClick; 

     public TestForm() 
     { 
      InitializeComponent(); 
      BindControlMouseClicks(this); 
     } 

     private void BindControlMouseClicks(Control con) 
     { 
      con.MouseClick += delegate(object sender, MouseEventArgs e) 
      { 
       TriggerMouseClicked(sender, e); 
      }; 
      // bind to controls already added 
      foreach (Control i in con.Controls) 
      { 
       BindControlMouseClicks(i); 
      } 
      // bind to controls added in the future 
      con.ControlAdded += delegate(object sender, ControlEventArgs e) 
      { 
       BindControlMouseClicks(e.Control); 
      };    
     } 

     private void TriggerMouseClicked(object sender, MouseEventArgs e) 
     { 
      if (GlobalMouseClick != null) 
      { 
       GlobalMouseClick(sender, e); 
      } 
     } 
    } 
} 

यह समाधान न केवल शीर्ष स्तर के नियंत्रण के लिए काम करेंगे, लेकिन भी इस तरह के पैनल के अंदर रखा नियंत्रण के रूप में नियंत्रण नेस्ट।

+0

धन्यवाद एक टन! एक सरल और सुरुचिपूर्ण समाधान। आश्चर्य है कि माउस क्लिक के लिए 'KeyPreview' के बराबर कुछ क्यों नहीं है –

संबंधित मुद्दे