Использование XamlReader для элементов управления, у которых нет конструктора по умолчанию - PullRequest
3 голосов
/ 25 февраля 2010

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

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

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

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

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

Невозможно создать объект типа 'System.Windows.Ink.Stroke'. Ошибка CreateInstance, которая может быть вызвана отсутствием общедоступного конструктора по умолчанию для System.Windows.Ink.Stroke.

В определении Stroke я вижу, что для его создания требуется как минимум StylusPointsCollection. Я предполагаю, что это то, что говорит мне ошибка, хотя предполагал, что это будет обработано XamlReader. Попытка преобразовать Xaml из Stroke с 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, как правильно создать обводку?

1 Ответ

3 голосов
/ 25 февраля 2010

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

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

В вашем случае 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;

НТН.

...