在同一程序集中加载松散样式XAML时出现XAMLParseException:创建类型失败

时间:2014-05-15 20:07:34

标签: c# wpf xml-namespaces resourcedictionary xamlparseexception

我希望我的WPF应用程序的用户能够在两种样式之间进行选择:默认的WPF样式和我自己的自定义样式。我创建了一个资源字典,其中包含自定义样式的所有样式元素。资源字典位于同一个项目中。

<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:&#34;从本地文本创建一个Type:MainWindow失败&#34;。

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

在几个线程中,人们建议添加&#34; assembly =&#34;到松散的XAML顶部的xmlns。如果我这样做,XAML文件本身不再构建。

Error: 'Cannot create unknown type '{clr-namespace:NameSpace.Properties}Settings'.'

这里有人建议将XAML的构建操作设置为&#39; page&#39;但我的XAML文件就是这种情况......

我对编程很陌生,我的理解非常有限,但我通常能够通过浏览网页解决问题。不过这次不是。

我认为由于我缺乏理解,我必须找到一些微不足道的东西。或者我是以一种完全错误的方式处理我的原始问题(让用户在2种风格中选择)?

1 个答案:

答案 0 :(得分:2)

如果您要在运行时加载Xaml文件,则不需要编译它。尝试将构建操作更改为“资源”,然后将assembly=限定符添加到命名空间导入中,如linked answer建议的那样。

或者,将Xaml文件构建为“Page”,但为其指定一个类名,以便可以使用构造函数对其进行实例化:

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

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

如果你走这条路,你不需要添加assembly=限定符。