现在的位置: 首页 > 综合 > 正文

利用可视化设计器时遇到的运行时、编译期的矛盾

2013年03月04日 ⁄ 综合 ⁄ 共 1118字 ⁄ 字号 评论关闭

最近在做一个Winform的项目,这个项目要求界面的颜色、字体都是可以配置的,怎么配置都好说,主要用到的就是控件属性的绑定,还有一点,就是配置文件。就在这个地方,有了一点儿小麻烦。
先说一下工程的结构:
所有的自定义控件是一个工程,编译为dll;Form是另外一个工程,引用这些dll,生成exe。只有一个配置文件是和exe同目录的,另外的配置文件(包括定义控件属性的文件)都在那个配置文件中设置的。
这就造成问题了,程序在运行的时候没有问题,但是在利用设计器设计Form的时候,发生找不到配置文件的错误。
到这里,你也许就明白了,我们的配置文件由于是在配置文件中定义的,只能在运行时取得;而设计器则利用的是预编译技术,需要在编译期取得配置文件的位置。
矛盾产生了,怎样解决呢?
把定义控件属性的配置文件的路径当作Const写到代码里?
这是我们首先想到的,当然了,虽然有了一些限制,但是确实是很好用的,不过新的问题又来了。
在测试的时候,需要测试这个配置文件中定义的属性是否都被正确设置了,而且需要对配置文件的路径进行变化。
麻烦来了!
在第一次测试的时候,修改了配置文件和代码里的路径之后,编译了控件的工程。运行exe,却发现界面没有任何变化。
在经过反复确认之后,想到了是不是Const的问题。
也许大家都知道,Const是在编译期替换的,也就是说在编译为dll之后,还需要编译Form的工程,这个可真是受不了。
又是一个矛盾。
在编译期需要利用到Const,在运行时却又不希望Const起作用。
在经过查找MSDN之后,发现了类LicenseManager和枚举类型LicenseUsageMode。
用法如下:

1    if (LicenseManager.CurrentContext.UsageMode == LicenseUsageMode.Runtime)
2    {
3        //在运行时使用
4    }

5
6    if (LicenseManager.CurrentContext.UsageMode == LicenseUsageMode.Designtime)
7    {
8        //在设计时由可视化设计器或编译器使用
9    }

在运行时利用配置文件中的路径,在利用设计器的时候利用Const中的,一举两得,很是方便啊。
希望以上对大家有所帮助。
最后附上MSDN的URL:
http://www.msdn.net/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemcomponentmodellicenseusagemodeclasstopic.asp

抱歉!评论已关闭.