2015-02-20 3 views
1

Я знаю, что для элементов управления с указанными токенами clr-namespace: и assembly= XamlReader просто ищет этот тип в указанной сборке.Как создавать XamlReader.Read или XamlReader.Parse типы экземпляров, чтобы построить дерево wpf?

Но как насчет элементов управления WPF по умолчанию в пространстве имен по умолчанию xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"?

Я пытаюсь получить Тип каждого элемента в дереве XElement, но я не знаю, как его найти, когда сборка не указана?

Например, все следующие примеры возвращают нуль:

  • Type.GetType("Grid")
  • typeof(Control).Assembly.GetType("Grid")
  • Assembly.GetAssembly(typeof(Control)).GetType("Grid")

Помощь?

ответ

4

Для дублирования поведения XamlReader вы можете использовать команду XamlSchemaContext, чтобы выполнить поиск типа. Для получения дополнительной информации см. Default XAML Schema Context and WPF XAML Schema Context на MSDN.

Метод 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 Ресурсы.

+0

Это именно то, что я искал, и он отлично работает. Спасибо!!! –

+0

как насчет его тиражирования, пытаясь найти приложенные свойства? – Maslow

+0

Не уверен @Maslow - я больше не использую это ни для чего, но знаю, что это не удается для нескольких вещей (например, некоторых ресурсов). –