首页 文章

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

提问于
浏览
2

嗨,我正在扩展一个用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)
{
// code to handle event...
}

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

3 回答

  • 0

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

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

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

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

  • 0

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

    我可以问为什么不呢?

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

  • 2

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

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

    Example

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

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

相关问题