关于HelpProvider的使用方式

NorZ NorZ 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如果用过HelpProvider的人,应该都知道,这个Control相对而言,使用还是很简单的,但是对于部署的方式方法,我存在疑问,不知能否有高手来解答...
背景: 一个项目,有很多Dialogue/Form,每个Form上也有多个Controls. 需求是当按下 F1 键时, 能够打开对应Control或者Form的帮助页面(html格式,注意,使用的不是chm文件). 由于使用html文件, HelpProvider控件自带的SetHelpKeyWord()方法不能像在使用chm文件的时候那样生效. 比如, 使用chm文件时, 我只需要将HelpProvider.HtmlNameSpace设置为chm文件的路径, 再将对应控件的帮助页面通过SetHelpKeyWord(Control ctl, string keyWord)的string参数传入, 就能够自动打开chm文件中keyWord对应的页面. 但是如果使用的是html文件, 就不会如此智能了,具体可以参考 http://larryzhu.bokee.com/6638197.html 这里的描述.
由于以上的限制, 我决定捕获 F1 的KeyDown事件, 然后将
HelpProvider.HtmlNameSpace = HelpProvider.GetHelpKeyWord(this);

继而,由于每个Form都需要实现这样一个事件...因此,我写了一个这个

public class HelpForm : Form
{
public HelpForm()
{
this.KeyPreview = true;
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_OnKeyDown);
}

private void Form_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == System.Windows.Forms.Keys.F1)
{
HelpProviderSingleTon.MyHelpProvider.HelpNamespace = HelpProviderSingleTon.MyHelpProvider.GetHelpKeyWord(this);
}
}
}

上面的代码, 使用的是一个全局的单例. 我当然也可以用类似的代码实现多实例的

public class HelpForm : Form
{
private HelpProvider helpProvider;
public HelpForm()
{
this.helpProvider = new HelpProvider();
this.KeyPreview = true;
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_OnKeyDown);
}

private void Form_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == System.Windows.Forms.Keys.F1)
{
helpProvider.HelpNamespace = helpProvider.GetHelpKeyWord(this);
}
}
}

这样就引出了一个问题, 我是整个项目, 使用一个 HelpProvider实例呢, 还是每个Dialogue/Form用各自的HelpProvider对象? 注.两种方式都能够工作,已测,另外我已重载GetHelpKeyWord,能够获取当前焦点控件的KeyWord
由于在基类中无法得知该Form对应的html文件名,因此没有办法SetHelpKeyWord
将一个控件作为全局,实在不知道是否会有什么隐患,使用多个实例,又担心在内存使用和效率上会有损耗...
...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
NorZ
C# 111,128 成员 642,537 内容