Получить базу Uri без использования Application.Current - PullRequest
1 голос
/ 16 апреля 2010

Мои пользовательские элементы управления не загружаются в конструкторе VS.NET из-за исключения нулевой ссылки. Это связано с тем, как я извлекаю baseUri приложения, когда оно запускается в браузере:

_uriPrefix = Application.Current.Host.Source.AbsoluteUri.Substring(0,
     Application.Current.Host.Source.AbsoluteUri.IndexOf("/ClientBin")).Trim();

Согласно сведениям об исключении и файлу справки, на который я направлен ( здесь ), я неправильно проектирую свое приложение для среды выполнения, которая не является браузером (то есть новый редактор WPF в VS. NET или Expression Blend).

Итак, вопрос в том, как извлечь baseUri (часть http://localhost: #### моего приложения), если я не могу использовать Application.Host, который, по-видимому, равен нулю во время разработки? Есть ли безопасный способ сделать это, чтобы я мог загрузить свои пользовательские элементы управления в конструкторе?

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Чтобы проработать проблему и ее решение (я не закончил писать, когда вы отправили свой собственный ответ)

Ваша проблема - контекст времени выполнения, в котором вы находитесь.

Когда ваша страницазапускается как на странице ASPX.Net, вы размещены на конвейере IIS-> ASP.Net.Это приложение передаст ваш HTTPContext, а ваш Application.Current ссылается на процесс W3WP.EXE, в котором конвейер ASP.Net обслуживает вашу страницу.

Когда ваша страница отображается в конструкторе MS Visual Studio, онане предоставляет этот HTTPContext, так как его нет.Запрос на визуализацию вашего элемента управления не был получен через HTTP-запрос, но дизайнер Visual Studio работал в Visual Studio.

Чтобы ваш элемент управления отображался правильно во время разработки, вам нужно будет добавить «время разработки»поддержка классов´. В платформе .Net есть номер, который вы можете использовать напрямую , но для пользовательской сериализации (записи серверных тегов ASP.Net или визуализации предварительного просмотра HTML со стилем) вам придется приложить еще больше усилий.и напишите свои собственные дизайнерские классы.

Надеюсь, это поможет,

0 голосов
/ 16 апреля 2010

Duh! Я ненавижу / люблю, когда я делаю это. Я отвечаю на свой вопрос (снова). Я могу использовать логическое значение DesignerProperties.IsInDesignTool, чтобы проверить, нахожусь ли я в режиме разработки:

if (!DesignerProperties.IsInDesignTool)
     _uriPrefix = Application.Current.Host.Source.AbsoluteUri.Substring(0,
          Application.Current.Host.Source.AbsoluteUri.IndexOf("/ClientBin")).Trim();

Теперь я могу просматривать свой пользовательский элемент управления в новом редакторе VS 2010. Да!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...