我创建了一个WPF应用程序,其中包含一些控件模板,我们称之为“默认模板”,这些模板编译到应用程序中。此应用程序还在运行时加载外部XAML文件,以及可以调用“自定义模板”的其他控件模板。
一切正常,直到我将Expression Blend SDK中的Callout控件添加到在运行时加载的'自定义'模板XAML,然后尝试使用该模板。我得到以下异常:
无法创建未知类型“{http://schemas.microsoft.com/expression/2010/drawing}Callout”。
我注意到如果我将Callout控件放在我的'默认模板'文件(已编译的那个)中并且第一个使用该默认模板,那么然后加载并使用它将起作用的“自定义模板”。
在我看来,当我将“自定义模板”添加到MergedDictionaries时,未加载引用的表达式sdk程序集。这里有什么想法吗?
这是XAML文件顶部的xmlns声明:
xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing
这是我在运行时添加资源字典的子代码:
Private Sub LoadResourceFileButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Try
Dim path As String = "\ResourceFiles\CustomMapSymbols.xaml"
Dim resDict As New ResourceDictionary
resDict.Source = New Uri(path, UriKind.Relative)
Application.Current.Resources.BeginInit()
Application.Current.Resources.MergedDictionaries.Add(resDict)
Application.Current.Resources.EndInit()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
答案 0 :(得分:1)
在我遇到以下错误的情况下,我有类似的症状:
无法创建未知类型 '{HTP://schemas.microsoft.com/expression/2010/drawing}标注'。
但是它在应用程序中编译的用户控件中工作正常。这让我觉得ResourceDictionary实现可能无法处理'漂亮'命名空间(htp:// ...),就像应用程序一样。
所以我尝试直接在声明中引用显式clr命名空间,它现在可以工作了。我显然必须将其余xaml中的引用更改为ef:Callout。轻松完成自动更换。我不想替换ed:用它来防止可能依赖它的Expression Blend。
外部资源字典中的旧命名空间声明:
xmlns:ed="htp://schemas.microsoft.com/expression/2010/drawing"
抱歉:我必须将http替换为htp才能发布此答案。
外部资源字典中的新名称空间声明:
xmlns:ef="clr-namespace:Microsoft.Expression.Controls;assembly=Microsoft.Expression.Drawing"
我通过使用对象浏览器找到了Callout类的确切命名空间。