我创建了一个自定义控件库,并在根路径中创建了一个名为“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问题,但没有解释为什么。
答案 0 :(得分:1)
因为您使用来自另一个程序集的资源文件,并且必须指向程序集名称。
编译到引用程序集中的资源文件的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相对于应用程序集,即使它们在库中使用也是如此。您的资源位于引用的程序集中,因此您必须指定其名称。