WPF-如何从Pack URI获取控件的代码隐藏类型定义?

时间:2018-10-31 15:56:27

标签: c# wpf

在WPF中是否有保存此数据的方法或映射?我想传递URI并获得Type作为回报?

我知道Application.GetResourceStream(URI),但这会返回BAML流。

谢谢。

1 个答案:

答案 0 :(得分:0)

经过一番研究,我没有找到任何可以从URI返回基础类型的方法。

URI所做的全部工作都指向嵌入在某个程序集中的资源,而我通过手动提取资源来获得所需的信息:

public static Type GetTypeFromUri(Uri uri)
{
    Type type = null;
    using (var stream = Application.GetResourceStream(uri).Stream)
    using (var reader = new Baml2006Reader(stream))
    {
        while (reader.Read())
        {
            if (reader.Type != null)
            {
                type = reader.Type.UnderlyingType;
                break;
            }
        }
    }

    return type;
}

以下代码在一些假设下起作用:

  • 将XAML资源的构建操作设置为Page(已编译为BAML) enter image description here
  • Baml2006Reader发现的第一个类型是Code-Behind类型(例如,如果类没有像ResourceDictionary这样的Code-Behind类型,则将ResourceDictionary作为Type)。我对BAML的结构不太熟悉,但一些测试表明确实如此。

测试表明,读取器首先解析包含的名称空间,然后解析代码背后的Type,因此会调用reader.Read()的一些迭代(其中reader.Type为空,但reader.Namespace已填充-我们不需要的),然后是我们需要的部分。

如果我们继续阅读流,它将遍历可视化树并解析子类型。

由于Wikipedia这样说:

  

在运行时,框架引擎从程序集资源中提取.BAML文件,对其进行解析,然后创建相应的WPF可视树或工作流。

我相信这是正确的方法。

如果您认为这不是最有效的方法,或者应该做得更好,请给出新的答案。