为什么我不能在Silverlight中移动资源字典?

时间:2011-03-01 21:56:16

标签: silverlight resources resourcedictionary

出于某种原因,以下代码给了我一个例外。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PPCa.Common.Infrastructure;component/Skins/Default.xaml"/>
            <ResourceDictionary>
                <app:ResourceWrapper x:Key="ResourceWrapper" />
                <app:NotOperatorValueConverter x:Key="NotOperatorValueConverter" />
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>                
</Application.Resources>

以下是例外:

System.Windows.Markup.XamlParseException occurred
  Message=Failed to assign to property 'System.Windows.ResourceDictionary.Source'. [Line: 11 Position: 44]
  LineNumber=11
  LinePosition=44
  StackTrace:
       at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
  InnerException: 

第11行是这样的:

<ResourceDictionary Source="/PPCa.Common.Infrastructure;component/Skins/Default.xaml"/>

我是否错误地合并了我的词典?

4 个答案:

答案 0 :(得分:9)

为什么没有人回答我的问题?我被列入黑名单或其他什么。人们过去经常帮助我。无论如何,我发现了我的问题。唯一的例外是红鲱鱼。该问题与我的应用程序资源定义无关。我在资源词典中深入研究的问题。我合并引用了字典中不再存在的字典。这很难搞清楚。

答案 1 :(得分:4)

这些词典是否在同一个XAP中?如果是这样,相对路径应该起作用。我已经使用了所有相对路径来合并字典而没有任何问题。以下是我的一个例子:

<Application.Resources>
    <ResourceDictionary x:Name="appDictionary">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="ControlStylesDictionary" 
                  Source="Resources/Styles/ControlStyles.xaml" />
            <ResourceDictionary x:Name="MenuStylesDictionary" 
                  Source="Resources/Styles/MenuStyles.xaml" />
    </ResourceDictionary>
</Application.Resources>

这是我在你的XAML中可以看到的唯一区别。

答案 2 :(得分:3)

如果字典在另一个XAP中,则需要download the XAP and load the dictionary从那里开始。

答案 3 :(得分:1)

我遇到了同样的问题,同样的通用错误信息并找到了解决方案。这似乎是一个错误恕我直言。

我正在为.Net,SL5,WP7.1构建应用程序。为此,我将代码放在.Net应用程序中,并为其他项目添加源链接。效果很好。

我的主要应用项目名为MyApp.Net,MyApp.SL和MyApp.WP。但是,我只为MyApp创建这些项目的默认命名空间和项目输出。再次,它应该工作得很好。

我将资源放在项目MyApp.Resources.Net,MyApp.Resources.SL和MyApp.Resources.WP中。由于Expression Blend希望直接​​访问物理文件并且(例如)MyApp.Resources.WP项目包含指向MyStyles.xaml文件的源链接,因此使用VS源链接会有一些小故障。 MyApp.Resources.Net项目。因此,我的所有资源项目实际上都包含物理文件。这也可以,我只需要手动同步文件。到目前为止没问题。

但是,对于我的资源项目,我将命名空间和输出文件更改为MyApp.Resources。这使我的应用程序代码也变得简单,无论它是为其构建的平台,命名空间都是相同的。

是的,我知道这有点复杂,但它允许我构建3个平台(技术上,如果你包括Blendability和UnitTesting),所有平台都具有相同的代码库。

要继续,如果我创建一个ResourceDictionary

<ResourceDictionary Source="/MyApp.Resources;component/Styles/TextStyles.xaml"/>

我无法分配属性'System.Windows.ResourceDictionary.Source'等...

简而言之,我发现如果程序集名称包含'。'出现此错误。例如,如果我将项目名称更改为“资源”,则可以正常工作。或者,如果我使用默认构建名称“MyApp.Resources.WP”保留我的项目,它也可以正常工作。

这与更改我的资源dll输出文件名无关,我整天更改它们并且效果很好,但如果它们包含'。'我得到了上述错误。例如,我可以将输出名称更改为“MyAppResourceThatWorks”(将项目名称保留为MyApp.Resources.WP并将其加载到App.xaml中

<ResourceDictionary Source="/MyAppResourceThatWorks;component/Styles/TextStyles.xaml"/>

效果很好。将输出名称更改为“MyAppResourcesThatDoNot.Work”并使用

加载它
<ResourceDictionary Source="/MyAppResourceThatDoNot.Work;component/Styles/TextStyles.xaml"/>

失败。

是的,我尝试更改装配属性等等。这是Pack Uri的加载问题。