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... }
非常感谢任何关于不同方法的建议或想法 - 谢谢
答案 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);
}