关于HelpProvider的使用方式

NorZ 2015-01-06 03:58:44
如果用过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
将一个控件作为全局,实在不知道是否会有什么隐患,使用多个实例,又担心在内存使用和效率上会有损耗...
...全文
205 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang1struts1yun 2015-01-13
  • 打赏
  • 举报
回复
最好封装用一个,多了肯定会有问题的

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧