【问题标题】:WPF ResourceDictionary Loaded at Runtime Not Loading Referenced AssembliesWPF ResourceDictionary 在运行时加载未加载引用的程序集
【发布时间】: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


【解决方案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 类的确切命名空间。

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2010-11-26
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多