Pregunta

Tengo algunas representaciones de cadena de objetos XAML, y quiero construir los controles. Estoy usando el Xamlreader.Parse función para hacer esto. Para un control simple como el botón que tiene un constructor predeterminado que no toma ningún parámetro, esto funciona bien:

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

Sin embargo, cuando trato de hacer esto a un control de accidente cerebrovascular, falla. Primero probando un trazo vacío simple:

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

Esto da el error:

No se puede crear objeto de tipo 'System.Windows.ink.Stroke'. CreateInstance falló, lo que puede ser causado por no tener un constructor predeterminado público para 'system.windows.ink.stroke'.

En la definición de accidente cerebrovascular, veo que necesita al menos una styluspointscollection para ser construida. Supongo que esto es lo que el error me dice, aunque suponía que el XamLReader lo maneja un poco. Intentar transformar un XAML de trazo con StylusPoints en él da el mismo error:

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);

¿Qué estoy haciendo mal? ¿Cómo le digo al XamLreader cómo crear el trazo correctamente?

¿Fue útil?

Solución

Es una "característica" del lenguaje XAML, es declarativo y no sabe nada sobre constructores.

La gente usa ObjectDataprovider en xaml para "traducir" y envolver instancias de clases que no tienen un constructor sin parámetros (es También es útil para enlace de datos).

En su caso, el XAML debe verse aproximadamente así:

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

Y el código debería ser:

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

Hth.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top