【问题标题】:Global event handler for all controls for User Help用户帮助的所有控件的全局事件处理程序
【发布时间】:2009-04-21 11:07:23
【问题描述】:

您好,我正在扩展一个用 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(对象发送者,EventArgs e)
{
// 处理事件的代码...
}

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

【问题讨论】:

    标签: c# winforms events context-sensitive-help


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 实际上我已经阅读了这篇文章并且已经实现了 ProcessKeyPreview 方法(顺便说一句,帮助上下文需要直接来自数据库,因此窗口帮助文件格式不是一个选项)。
    • 然后我记得我需要使用问号按钮(通常是表单的右上角)提供帮助,您可以在其中单击控件并再次获得上下文帮助。经过今天早上的一些研究,我遇到了 HelpRequested 事件,这似乎比捕获 F1 键更合适,因为 .Net 框架专门为开发人员公开此事件以实现帮助系统。同样得到建议 - 谢谢:)
    • 是的,这是建议的解决方案,但如果您想触发“全局”事件,则可以自己从 WndProc 触发它,并拥有一个事件处理程序。
    【解决方案2】:

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

    我能问为什么不吗?

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

    【讨论】:

    • 嗯,它只是感觉不像是一种“干净”的方式来做到这一点——代码必须“遍历”控制层次结构。您的代表建议肯定会奏效,谢谢:)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      相关资源
      最近更新 更多