【发布时间】:2011-08-01 15:59:12
【问题描述】:
我创建了一个 WPF 应用程序,其中包含一些我们可以称为“默认模板”的控件模板,这些模板被编译到应用程序中。此应用程序还在运行时加载一个外部 XAML 文件,其中包含可以调用“自定义模板”的其他控件模板。
一切正常,直到我将 Expression Blend SDK 中的标注控件添加到在运行时加载的“自定义”模板 XAML,然后尝试使用该模板。我得到以下异常:
无法创建未知类型“{http://schemas.microsoft.com/expression/2010/drawing}Callout”。
我注意到,如果我将 Callout 控件放在我的“默认模板”文件(已编译的那个)中并且 first 使用该默认模板,则 then 加载并使用“自定义模板”就可以了。
在我看来,当我将“自定义模板”添加到 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
【问题讨论】:
-
听起来好像您希望动态加载的 Xaml 自动获取其所需的程序集并为您动态创建这些引用。不幸的是,这不起作用:您必须添加对程序集的引用,或者自己加载程序集。
-
对不起,我忘了提,表达式混合程序集 (Microsoft.Expression.Drawing.dll" 已在应用程序引用中引用,它显示在 bin 文件夹中 - 所以我知道它在那里. 感谢您的回复。还有其他想法吗?
-
在加载自定义 Xaml 之前,您是否尝试过添加所需程序集的加载?如果它们已经被加载,它不会做任何事情,所以在这种情况下它是很好的防御代码。
-
我尝试在添加资源字典之前和之后添加此代码:Assembly.Load("Microsoft.Expression.Drawing") 但我仍然收到错误消息。你是这个意思吗?
-
是的,但前提是您确定这是唯一缺少的程序集。你确定是吗?此类型可能还有其他依赖程序集。另外,您是否正在检查 InnerException 以查看您的异常是否提供了有关为什么无法创建类型的更多信息?
标签: wpf