C# 包URI不适用于generic.xaml合并字典

C# 包URI不适用于generic.xaml合并字典,c#,wpf,resourcedictionary,pack-uri,C#,Wpf,Resourcedictionary,Pack Uri,我创建了一个自定义控件库,并在根路径中创建了一个名为“FlipView”的控件。然后我删除了Generic.xaml中的样式,并将其移动到根路径中名为FlipView.xaml的自己的资源字典中。现在,我使用以下代码将该资源字典合并到Generic.xaml: <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/FlipView.xaml"

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

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/FlipView.xaml" />
</ResourceDictionary.MergedDictionaries>
为什么会这样

对于WPF项目,这似乎是多余的,因为
pack://application,,,/
指根路径和
wpfasemblyname;组件/
再次引用根路径。为什么需要
Generic.xaml


编辑:我看到了这个问题,但它并没有解释原因。

因为您使用了另一个程序集的资源文件,必须指向程序集名称

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

  • 权威:美联社plication:///.

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

    AssemblyShortName[;版本][;公钥];组件/路径

    • AssemblyShortName:引用程序集的短名称
    • ;版本[可选]:包含资源文件的引用程序集的版本。当加载两个或多个具有相同短名称的引用程序集时,将使用此选项
    • ;公钥[可选]:用于对引用的程序集进行签名的公钥。当加载两个或多个具有相同短名称的引用程序集时,将使用此选项
    • ;component:指定引用的程序集是从本地程序集引用的
    • /Path:资源文件的名称,包括相对于引用程序集项目文件夹根的路径
以下示例显示位于引用程序集项目文件夹根目录中的XAML资源文件的包URI

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

为了避免在同一程序集中声明样式时地址中出现冗余字,可以在不指向库的情况下声明样式文件:

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

克莱门斯的回答:


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

否。它不是引用的程序集。generic.xaml、flipview.xaml和flipview.cs都位于控件库程序集的根目录中。应用程序中的包URI与应用程序集相关,即使它们在库中使用。您的资源位于引用的程序集中,因此您必须指定其名称。这也不起作用@克莱门斯,哦,这就解释了。快点,你能用克莱门斯的评论更新答案吗?或者Clemens可以添加一个答案?如果控件在WPF程序集中,任何包uri都可以正常工作。但是当它在另一个程序集中时,我必须包含程序集名称,你在做哪一行?当我在同一个WPF项目中使用文件时,在没有程序集的情况下指定包uri可以很好地工作。但是,当我需要另一个程序集中的文件时,我显然需要指定该文件。但在控制库中,包uri仍然必须指定程序集,即使文件位于同一控制库程序集中,这与WPF程序集的情况不同,WPF程序集可以保留该部分。
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="FlipView.xaml" />
</ResourceDictionary.MergedDictionaries>