XamlReader.Read 或 XamlReader.Parse 如何实例化类型以构建 wpf 树?

How do XamlReader.Read or XamlReader.Parse instantiate types in order to build the wpf tree?

我知道对于具有指定 clr-namespace:assembly= 标记的控件,XamlReader 仅在指定程序集中查找该类型。

但是默认命名空间 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 中的默认 WPF 控件呢?

我正在尝试获取 XElement 树中每个元素的 Type,但我不知道在没有指定程序集的情况下如何找到它?

例如以下所有例子return null:

帮忙?

要复制 XamlReader 的行为,您可以使用 XamlSchemaContext 来执行类型查找。有关详细信息,请参阅 MSDN 上的 Default XAML Schema Context and WPF XAML Schema Context

GetXamlType 方法允许您传递一个 Xaml 命名空间和类型名称:

var context = new XamlSchemaContext();
var xtype = context.GetXamlType(new XamlTypeName("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Grid"));
var gridType = xtype.UnderlyingType;
// gridType == typeof(System.Windows.Controls.Grid)

请注意,此技术在存在命名空间时也适用,它允许您使用单一的统一机制来解析您的 Xaml 资源。