用户帮助的所有控件的全局事件处理程序

嗨,我正在扩展一个用C#编写的Windows应用程序,以便在用户点击F1键时为用户提供帮助(在聚焦控件的上下文中)。

我想要做的是使用Control.HelpRequested事件,但我不知道如何扩展所有控件来处理此事件。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.helprequested.aspx

使用“手动”更新每个控件以处理此事件并不是真的可行,我真的不喜欢循环遍历表单中的所有控件(如表单打开)以关联事件处理程序的想法。

是否有一种简洁的方法来扩展表单的所有控件来处理特定事件?

这只是弥补,但我几乎觉得我应该能够写出这样的东西

  [HandleEvent Control.HelpRequested,ApplyTo Typeof(Control)]
 void MyEventHandler(object sender,EventArgs e)
 {
 //处理事件的代码......
 } 

任何关于不同方法的建议或想法都非常感谢 – 谢谢

此示例( http://www.codeproject.com/KB/cs/ContextHelpMadeEasy.aspx )显示如何在WndProc中捕获F1键,然后仅显示一种方法的帮助。

该文章的想法是实现一个暴露控件ID的接口,然后根据该id显示上下文帮助。 然后,F1处理程序检查您的控件是否实现了该接口,如果没有,则检查控件的父级,直到找到该接口的实现。

但更简单的方法(如果您不想为每个控件添加ID)是修改F1处理程序以显示基于静态类型字典(例如Dictionary)的上下文帮助,该字典将包含每个支持的控件的主题ID 。 因此,只要您需要将主题与指定控件相关联,就可以更新字典。

同样,通过向该字典添加某种提供者(委托或接口)来为这种方法添加更多抽象会更明智。 例如,您可能需要其他逻辑来根据控件的类型,名称或其他属性显示主题。

我真的不喜欢循环遍历表单中的所有控件(如表单打开)以关联事件处理程序的想法。

我可以问为什么不呢?

你可以编写一个函数,它将一个委托和一个类型列表作为一个争论,它将与你的“希望”HandleEvent属性具有完全相同的效果。

HelpRequested支持冒泡机制。 它会激活您的主动控件,如果您不处理该事件并且未将其事件arg的Handled属性设置为true ,则它会向上形成父控件层次结构。

因此,只需处理表单的HelpRequested ,然后,您可以根据对表单或其父层次结构的主动控制来决定要显示的帮助。

如果您处理如下表单的HelpRequested事件,那么当您按F1时,将弹出一个消息框并显示活动控件的名称:

 private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent) { var c = this.ActiveControl; if(c!=null) MessageBox.Show(c.Name); }