包URI不适用于generic.xaml合并的词典

时间:2016-05-06 15:21:29

标签: c# wpf resourcedictionary pack-uri

我创建了一个自定义控件库,并在根路径中创建了一个名为“FlipView”的控件。然后我删除了func parseJsonData(data: NSData) -> [Media] { var medium = [Media]() do { let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary // Parse JSON data let jsonMedium = jsonResult?["media"] as! [AnyObject] for jsonMedia in jsonMedium { let media = Media() media.title = jsonMedia["medium"]["title"] as! String media.description = jsonMedia["medium"]["description"] as! String media.category = jsonMedia["medium"]["category"] as! String media.image = jsonMedia["medium"]["image"] as! String if let IDer = jsonMedia["medium"]["id"] as? Int{ var stringIder = String(IDer) media.identifierString = stringIder } medium.append(media) } } catch { print(error) } return medium } 中的样式,并将其移动到根路径中名为Generic.xaml的自己的资源字典中。现在我使用以下代码将该资源字典合并到FlipView.xaml

Generic.xaml

然后我在另一个wpf项目中使用了该控件,但它抛出<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/FlipView.xaml" /> </ResourceDictionary.MergedDictionaries> XamlParseException

  

找不到资源'flipview.xaml'。

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

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

Generic.xaml:

MyCustomControls

为什么会这样?

对于WPF项目,这似乎是多余的,因为<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MyCustomControls;component/FlipView.xaml" /> </ResourceDictionary.MergedDictionaries> 引用根路径,pack://application,,,/再次引用根路径。为什么WpfAssemblyName;component/需要它?

编辑:我看过this问题,但没有解释为什么

1 个答案:

答案 0 :(得分:1)

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

As MSDN says:

  

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

     
      
  • 权限:application:///。

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

                AssemblyShortName [;版本] [;公钥];成分/路径

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

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

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

<强>更新

为避免地址中的冗余单词在同一个程序集中声明样式,可以声明样式文件而不指向库:

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

克莱门斯回答:

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