1

我制作了一个自定义控件库,并在根路径中制作了一个名为“FlipView”的控件。然后我删除了样式并将其移动到根路径中Generic.xaml命名的自己的资源字典中。FlipView.xaml现在我将该资源字典合并为Generic.xaml使用以下代码:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/FlipView.xaml" />
</ResourceDictionary.MergedDictionaries>

然后我在另一个wpf项目中使用了该控件,但它抛出了XamlParseException一个InnerException

找不到资源“flipview.xaml”。

为什么不能呢?资源字典位于控件库项目的根路径中。

如果我用(是我的自定义控件库的名称)替换Source属性设置器,它工作得很好。"pack://application:,,,/MyCustomControls;component/FlipView.xaml"MyCustomControls

通用的.xaml:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MyCustomControls;component/FlipView.xaml" />
</ResourceDictionary.MergedDictionaries>

为什么会这样?

对于 WPF 项目,这似乎是多余的,因为它pack://application,,,/指的是根路径,WpfAssemblyName;component/又指的是根路径。为什么有必要Generic.xaml

编辑:我见过这个问题,但它没有解释为什么

4

1 回答 1

1

因为您使用来自另一个程序集的资源文件,并且必须指向程序集名称。

正如 MSDN 所说:

编译成引用程序集的资源文件的包 URI 使用以下权限和路径:

  • 权限:应用程序:///。

  • Path:编译成引用程序集的资源文件的名称。路径必须符合以下格式:

    AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName:被引用程序集的短名称。
    • ;Version [可选]:包含资源文件的引用程序集的版本。这在加载两个或多个具有相同短名称的引用程序集时使用。
    • ;PublicKey [可选]:用于签署引用程序集的公钥。这在加载两个或多个具有相同短名称的引用程序集时使用。
    • ;component:指定被引用的程序集是从本地程序集引用的。
    • /Path:资源文件的名称,包括其路径,相对于所引用程序集的项目文件夹的根目录。

以下示例显示了 XAML 资源文件的包 URI,该文件位于被引用程序集的项目文件夹的根目录中。

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

更新:

为了避免在地址中使用多余的词来在同一个程序集中声明样式,可以在不指向库的情况下声明您的样式文件:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="FlipView.xaml" />
</ResourceDictionary.MergedDictionaries>

克莱门斯的回答:

看看这里的第三个图。应用程序中的包 URI 与应用程序程序集相关,即使它们在库中使用也是如此。您的资源位于引用的程序集中,因此您必须指定其名称。

于 2016-05-06T15:49:18.587 回答