2010-02-25 7 views
3

У меня есть некоторые строковые представления объектов Xaml, и я хочу создать элементы управления. Для этого я использую функцию XamlReader.Parse. Для простого управления, такие как Button, который конструктор по умолчанию не принимает никаких параметров это работает отлично:Использование XamlReader для элементов управления, у которых нет конструктора по умолчанию

var buttonStr = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">Text</Button>"; 
var button = (Button)XamlReader.Parse(buttonStr); 

Однако, когда я пытаюсь сделать это, например, он не работает. Первый пытаются простой пустой Stroke:

var strokeStr = "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Stroke>"; 
var stroke = (Stroke)XamlReader.Parse(strokeStr); 

Это дает ошибку:

Cannot create object of type 'System.Windows.Ink.Stroke'. CreateInstance failed, which can be caused by not having a public default constructor for 'System.Windows.Ink.Stroke'.

В определении инсульта я вижу, что он должен, по крайней мере StylusPointsCollection будет построен. Я предполагаю, что это то, о чем говорит мне ошибка, хотя и предполагал, что это будет обработано XamlReader. Попытка превратить Xaml инсульта с StylusPoints в нем дает ту же ошибку:

var strokeStr = 
    "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + 
     "<Stroke.StylusPoints>" + 
      "<StylusPoint X=\"100\" Y=\"100\" />" + 
      "<StylusPoint X=\"200\" Y=\"200\" />" + 
     "</Stroke.StylusPoints>" + 
    "</Stroke>"; 
var stroke = (Stroke) XamlReader.Parse(strokeStr); 

Что я делаю неправильно? Как сообщить XamlReader, как правильно создать Stroke?

ответ

3

Это «особенность» языка XAML, он декларативный и ничего не знает о конструкторах.

Люди используют ObjectDataProvider в XAML для «перевода» и переноса экземпляров классов, у которых нет конструктора без параметров (это also useful for data binding).

В вашем случае XAML должен выглядеть примерно так:

<ObjectDataProvider ObjectType="Stroke"> 
    <ObjectDataProvider.ConstructorParameters> 
     <StylusPointsCollection> 
      <StylusPoint X="100" Y="100"/> 
      <StylusPoint X="200" Y="200"/> 
     </StylusPointsCollection> 
    </ObjectDataProvider.ConstructorParameters> 
</ObjectDataProvider> 

И код должен быть:

var stroke = (Stroke) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data; 

HTH.

+0

Thx! Не знал об ObjectDataProvider .. – stiank81

+0

Это не совсем верно. XAML 2006 не знает о конструкторах, но XAML 2009, безусловно, делает. –

 Смежные вопросы

  • Нет связанных вопросов^_^