2011-11-25 63 views
6

我正在使用一些C#自定义控件(窗体,按钮等),它们使用皮肤系统,并且依赖于项目文件夹中的外部图像(在zip文件中)。现在,表单设计人员无法显示控件,因为我无法获得正确的zip文件路径。我需要的是一种在设计时获得组件或解决方案的途径。C#设计时间路径

我使用了两个项目:
DLL - 包含自定义控件。
主机应用程序 - 引用DLL并使用自定义控件。

在我的DLL自定义控件类,在运行时,我只是使用:

string skinPath = "./Skins/" + skin + ".zip"; 

这完美的作品,但在设计时,窗体设计器显示错误:

Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Skins\Black.zip'. 

查看了网站上的类似问题,我也试过以下内容:
1)

if (designMode) 
{ 
    EnvDTE.DTE dte = GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    string path = Path.GetDirectoryName(dte.Solution.FullName); 
} 

表单设计显示错误:

Object reference not set to an instance of an object. 

2)

if (designMode) 
{ 
    ITypeResolutionService typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; 
    string path = typeResService.GetPathOfAssembly(Assembly.GetExecutingAssembly().GetName()); 
} 

表单设计显示错误:

Object reference not set to an instance of an object. 

3)使用各种不同的路径的Assembly类。

没有任何工作。 我正在使用Visual C#2010 Express。

+0

呃。不要使用'as'那样的。改用cast。 –

+0

对不起,但它不是我的代码。我一直在复制和粘贴来自很多不同问题的代码,尝试不同的解决方案。 – Snip3r

+0

然后将'Black.zip'复制到'C:/ Program Files(x86)/ Microsoft Visual Studio 10.0/Common7/IDE/Skins /':) –

回答

1

你的第二次尝试(ITypeResolutionService)应该可以正常工作。只要确保您足够晚地致电GetService,那么Site属性就会非空。 OnHandleCreated是好的,控制构造函数太快了,并产生NullReferenceException

+0

这解决了它。非常感谢你。尽管选项2中的代码不起作用,但你说得太早就是对的。我在OnLoad事件处理程序中添加了选项1中的代码,并且宾果游戏:D非常感谢。 – Snip3r

+0

进一步更新,通过对路径进行一些调整,选项2也起作用:) – Snip3r