在Silverlight中使用ResourceDictionary出错

3
在我的Silverlight应用程序中,我有一个UserControl,我想引用一个在单独的XAML文件中的ResourceDictionary中的StaticResource。
我的UserControl看起来像这样:
<UserControl x:Class="ResourceDictionaryHeadache.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
    <UserControl.Resources>
        <ResourceDictionary Source="/SampleData.xaml" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 ItemsSource="{StaticResource SampleData}">
        </ListBox>
    </Grid>
</UserControl>

我的SampleData.xaml文件如下所示:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Headache="clr-namespace:ResourceDictionaryHeadache">
<Headache:PersonList x:Key="SampleData">
    <Headache:Person Name="Joe" Age="20" />
    <Headache:Person Name="Sam" Age="25" />
    <Headache:Person Name="Dave" Age="30" />
</Headache:PersonList>

我将SampleData.xaml文件的构建操作设置为内容(Content),但运行应用程序时,在用户控件构造函数的InitializeComponent()行上收到AG_E_PARSER_BAD_TYPE [Line: 5 Position: 44]错误消息。

这个错误是什么原因引起的?如何正确地引用这个资源?


有时在VS中将公共语言运行时异常设置为捕获未处理的异常,您可以获得更多关于实际问题的提示。(按下control-alt-E,然后检查CLRE旁边的Thrown) - Stephen Price
2个回答

4
将"Build Action"设置为资源,然后像下面这样引用它:
<ResourceDictionary Source="/AssemblyName;component/sampledata.xaml" />

确保从组件开始到最后都是小写字母,因为这样它才会出现在dll资源中。


这有什么帮助呢?在程序集中将XAML作为资源进行隐藏并不是很合理,将其作为XAP中的另一个条目更为自然。 - AnthonyWJones
今晚我会尝试一下。 "组件"是否总是字面上的"组件",或者它应该是项目中sampledata.xaml所在的子文件夹?--此外,我在这里有点同意安东尼的看法,至少在我的情况下,我更愿意将XAML作为“内容”而不是程序集中的资源。这让我感到疯狂,因为我已经看到了很多使用这种方式(作为内容)的示例,但它似乎在这里不起作用... - joshuapoehls
这实际上在我尝试重现您的问题时起作用了。是的,“component”字面上必须是“component”...您不需要子文件夹。我没有一个好的解释为什么会这样,但我有一种感觉,这与您的ResourceDictionary包含自定义类型以及使用两种不同方法实例化ResourceDictionary的时间有关。XAML文件的路径显然是正确的,解析器只是在使用Content方法时卡住了您的自定义PersonList类型,但在使用Resource方法时它却可用。 - Dan Auclair
我也遇到了同样的问题,只是在升级到VS2010 SP1之后。不管怎样,这个方法对我有用,谢谢。 - Dale

2

我觉得你资源字典里的这一行看起来不太对:

 xmlns:Headache="clr-namespace:ResourceDictionaryHeadache"

你的PersonList类真的定义在名为ResourceDictionaryHeadache的命名空间中吗?无论是或不是,我怀疑代码失败的原因是XAML找不到PersonList类型。 编辑 天啊!我刚注意到,在Source之前删除/,并将SampleData.xaml资源字典保留为默认的“Page”构建操作。
换句话说,如果你只是使用“添加新项”然后“资源字典”添加了XAML文件,则只需要在页面xaml中添加以下内容:
<UserControl.Resources> 
    <ResourceDictionary Source="SampleData.xaml" /> 
</UserControl.Resources>

那是正确的命名空间。PersonList类在这里显示:http://gist.github.com/271809。此外,如果我直接将ResourceDictionary文件的内容复制到UserControl的资源中,则可以正常工作。除非存在单独的文件意味着ResourceDictionary可以访问不同的内容,否则我不知道问题出在哪里。 - joshuapoehls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接