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

时间:2009-04-21 11:07:24

标签: c# winforms events

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

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

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

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

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

[HandleEvent Control.HelpRequested, ApplyTo Typeof(Control)]
void MyEventHandler(object sender, EventArgs e)
{
// code to handle event...
}

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

3 个答案:

答案 0 :(得分:2)

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

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

但是,一个更为简单的方法(如果你不希望将ID添加到每个控制)是修改F1处理器基于静态类型的词典(例如字典),以显示上下文帮助,其中将包括主题ID为每个支持的控件。因此,只要您需要将主题与指定控件相关联,就可以更新字典。

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

答案 1 :(得分:0)

  

我真的不喜欢这个想法   循环遍历a中的所有控件   形式(如表格打开)关联   事件处理程序。

我可以问为什么不呢?

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

答案 2 :(得分:0)

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);
}