Использование XamlReader для элементов управления, которое не имеет конструктора по умолчанию

StackOverflow https://stackoverflow.com/questions/2335900

  •  22-09-2019
  •  | 
  •  

Вопрос

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

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'.

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

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, как правильно создать ход?

Это было полезно?

Решение

Это «особенность» языка 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;

Hth.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top