XAMLParseException при загрузке свободного стиля XAML в той же сборке: не удалось создать тип

Я бы хотел, чтобы пользователь моего приложения WPF мог выбирать между двумя стилями: стилем WPF по умолчанию и моим собственным стилем. Я сделал Resource Dictionary, который включает в себя все элементы стиля пользовательского стиля. Словарь ресурсов находится в том же проекте.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Practicum21_Ben_Vandenberk">

...

    <Style TargetType="Window">
    <Setter Property="Background" Value="Black"></Setter>
</Style>
<Style TargetType="{x:Type local:MainWindow}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:BestellingDetail}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:CategorieDetail}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:KlantDetail}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:LeverancierDetail}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:ProduktDetail}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:WerknemerDetail}" BasedOn="{StaticResource {x:Type Window}}"/>

Когда я пытаюсь загрузить этот словарь в App.Current.Resources, используя следующий код, я получаю исключение XAMLParseException: "создание типа из текста local:MainWindow failed".

ResourceDictionary dic = new ResourceDictionary();
dic.Source = new Uri(path, UriKind.Absolute);
App.Current.Resources.MergedDictionaries.Clear();
App.Current.Resources.MergedDictionaries.Add(dic);

Я искал более двух часов.

WPF Loose XAML ResourceDictionary

В нескольких потоках люди предлагают добавить "assembly=" в xmlns в верхней части свободного XAML. Если я сделаю это, сам файл XAML больше не будет собираться.

Ошибка: "Невозможно создать неизвестный тип" {clr-namespace:NameSpace.Properties}Settings ". '

Здесь люди предложили установить действие сборки XAML на "page", но это уже имело место для моего файла XAML...

Я довольно плохо знаком с программированием, и мое понимание довольно ограничено, но я обычно могу решать проблемы, просматривая веб-страницы. Не в этот раз, хотя.

Я считаю, что это должно быть что-то тривиальное, что я не могу найти из-за моего непонимания. Или я решаю свою первоначальную проблему (позволяя пользователю выбирать между двумя стилями) совершенно неверным образом?

1 ответ

Решение

Если вы собираетесь загружать файл Xaml во время выполнения, вам не нужно его компилировать. Попробуйте изменить действие сборки на "Ресурс", затем добавьте assembly= квалификаторы для импорта вашего пространства имен, как предполагает связанный ответ.

Либо создайте файл Xaml как "Страница", но присвойте ему имя класса, чтобы вы могли создать его экземпляр с помощью конструктора:

<ResourceDictionary x:Class="Practicum21_Ben_Vandenberk.AlternateResources"
  ...>

App.Current.Resources.MergedDictionaries.Add(new AlternateResources());

Если вы идете по этому пути, вам не нужно добавлять assembly= классификаторы.

Другие вопросы по тегам