在运行时加载的WPF ResourceDictionary未加载引用的程序集

时间:2011-08-01 15:59:13

标签: wpf

我创建了一个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

1 个答案:

答案 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类的确切命名空间。