2

HI, I'm extending a windows application written in C# to provide help to the user (in the context of the focused control) when they hit the F1 key.

What I’d like to do is make use of the Control.HelpRequested event but I’m not sure how to extend all the controls to handle this event. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.helprequested.aspx

It’s not really feasible to update each control “by hand” to handle this event and I really don’t like the idea of looping through all the controls in a form (as the form opens) to associate the event handler.

Is there a neat way to extend all controls of a form to handle a specific event?

This is just made up but i almost feel like i should be able to write something like this

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

Any suggestions or perhaps ideas on a different approach are much appreciated - Thanks

4

3 回答 3

2

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

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

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

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

于 2009-04-21T11:19:43.943 回答
0

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

我能问为什么不吗?

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

于 2009-04-21T11:17:56.727 回答
0

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

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

例子

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

private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent)
{
    var c = this.ActiveControl;
    if(c!=null)
        MessageBox.Show(c.Name);
}
于 2016-07-24T17:26:16.880 回答