Вопрос Джейнса на самом деле связан с этим, у меня та же проблема. я создал подкласс ResourceDictionary, как предложил Фуванадил, однако во время разработки это выдает исключение «префикс Uri не перекодирован»
Я получаю эту ошибку, даже если все подклассы присваивают свойство base.Source ResourceDictionary. Если я заменю свой собственный ResourceDictionary обычным, он будет работать нормально, так что я предполагаю, что разработчик сидра делает что-то особенное, возможно, заменяя ResourceDictionary чем-то другим
Я не пробовал это в смеси, но я получаю это в VS2010 (sp1 beta)
Может кто-нибудь подтвердить, что опубликованный awnser работает в vs2010?
-edit-
Возможно, что дизайнер на основе wpf отключает логику определения местоположения ресурса. Я читал в другом месте , что пакетные URI основаны на сборке -executing, а не на сборке -local-. я сообщу, что я найду
-edit2 / решение-
Хорошо, поэтому мне удалось заставить решение Foovanadil работать в VS2010, вот сделка. Оказывается, я был наполовину прав, предположительно потому, что конструктор wpf в VS2010 сам по себе написан на wpf или, чтобы обеспечить лучший опыт проектирования, ResourceDictionary (или какой-то другой класс, который вместо этого использует VS2010) ведет себя по-разному во время разработки.
Оказывается, VS заменяет URI, введенный в xaml. Аттестация экземпляра VS и установка точки останова в установщике для Source
показывает, что фактическое передаваемое значение отличается от того, что мы ожидаем.
Учитывая xaml:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:DesignTimeResourceDictionary Source="myxamlfile.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
Source
установлено на
markup://1/file:///c:/PathtoMyapp/MainWindow.xaml#0/myxamlfile.xaml
вместо
/myxamlfile.xaml
Вот почему мы получаем исключение для недействительного Uris.
Точно, когда и где VS2010 редактирует URI
s, этот способ во время разработки мне не известен, но переименование свойства Source
в DesignTimeResourceDictionary
во что-то другое не решает проблему.
К счастью, есть обходной путь. Если мы изменим тип Source
с Uri
на String
, конструктор VS не изменит значение. Затем в установщике мы создаем Uri и передаем его базовому свойству:
public new String Source {
get {
return base.Source.ToString();
}
set {
if( !IsInDesignMode )
return;
base.Source = new Uri( value, UriKind.RelativeOrAbsolute );
}
}
Обратите также внимание, что если вы используете этот подход (или любой другой, который я обнаружил, например, использование x: class в файле ресурсов и создание экземпляра его непосредственно из xaml) приведет к тому, что стили не будут обновлены, пока вы не соберете . Использование стандартного ResourceDictionary приведет к обновлению конструктора, как только вы отредактируете импортированные файлы ресурсов (даже перед сохранением). Это также указывает на то, что дизайнер обрабатывает ResrouceDictionary по-разному во время разработки.
Надеюсь, кто-нибудь найдет это полезным :)