由于null引用异常,我的自定义控件未加载到VS.NET的设计器中。这与我在浏览器中运行时检索应用程序的baseUri的方式有关:
_uriPrefix = Application.Current.Host.Source.AbsoluteUri.Substring(0,
Application.Current.Host.Source.AbsoluteUri.IndexOf("/ClientBin")).Trim();
根据我所指向的异常详细信息和帮助文件(here)我没有正确设计我的应用程序用于不是浏览器的运行时(即VS.NET中的新WPF编辑器或Expression Blend)。
所以,问题是如果我不能使用在设计时显然为null的Application.Host,如何检索baseUri(我的应用程序的http://localhost:####部分)?有没有一种安全的方法可以这样做,所以我可以在设计器中加载自定义控件?
答案 0 :(得分:1)
详细说明问题和解决方案(当你发布自己的答案时,我还没有写完)
您的问题是您所在的运行时环境。
当您的页面在ASPX.Net页面上运行时,您将由IIS-> ASP.Net管道托管。此应用程序将为您提供HTTPContext和您的Application.Current正在引用W3WP.EXE进程,其中ASP.Net管道正在为您的页面提供服务。
当您的页面显示在MS Visual Studio设计器中时,它不提供此HTTPContext,因为没有。呈现控件的请求不是通过HTTP请求,而是在Visual Studio中运行的Visual Studio设计器。
要在设计时正确显示您的控件,您必须添加“设计时支持类”。 There are a number in the .Net framework you can use directly,但是对于自定义序列化(编写服务器ASP.Net标记或使用样式呈现HTML预览),您必须付出更多努力并编写自己的设计器类。
希望这有帮助,
答案 1 :(得分:0)
咄!当我这样做时,我讨厌/喜欢。我正在回答我自己的问题(再次)。我可以使用DesignerProperties.IsInDesignTool布尔来测试我是否处于设计模式:
if (!DesignerProperties.IsInDesignTool)
_uriPrefix = Application.Current.Host.Source.AbsoluteUri.Substring(0,
Application.Current.Host.Source.AbsoluteUri.IndexOf("/ClientBin")).Trim();
现在,我可以在新的VS 2010编辑器中查看自定义控件。呀!