检索baseUri没有采用Application.Current

时间:2010-04-15 20:35:03

标签: silverlight

由于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:####部分)?有没有一种安全的方法可以这样做,所以我可以在设计器中加载自定义控件?

2 个答案:

答案 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编辑器中查看自定义控件。呀!