Frage

Ich habe einige Zeichenfolgendarstellungen von Xaml-Objekten und möchte die Steuerelemente erstellen.Ich verwende das XamlReader.Parse Funktion, um dies zu tun.Für ein einfaches Steuerelement wie Button, dessen Standardkonstruktor keine Parameter annimmt, funktioniert dies einwandfrei:

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

Wenn ich dies jedoch versuche, um z.B.Eine Schlaganfallkontrolle schlägt fehl.Versuchen Sie es zunächst mit einem einfachen leeren Strich:

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

Dies ergibt den Fehler:

Objekt vom Typ „System.Windows.Ink.Stroke“ kann nicht erstellt werden.CreateInstance ist fehlgeschlagen, was daran liegen kann, dass kein öffentlicher Standardkonstruktor für „System.Windows.Ink.Stroke“ vorhanden ist.

In der Definition von Stroke sehe ich, dass mindestens eine StylusPointsCollection erstellt werden muss.Ich gehe davon aus, dass mir der Fehler das sagt, obwohl ich irgendwie davon ausgegangen bin, dass dies vom XamlReader behandelt wird.Der Versuch, ein XAML von Stroke mit StylusPoints darin umzuwandeln, führt zu demselben Fehler:

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

Was mache ich falsch?Wie kann ich dem XamlReader mitteilen, wie der Strich korrekt erstellt werden soll?

War es hilfreich?

Lösung

Es ist ein „Feature“ der XAML-Sprache, es ist deklarativ und weiß nichts über Konstruktoren.

Leute benutzen ObjectDataProvider in XAML, um Instanzen von Klassen zu „übersetzen“ und zu verpacken, die keinen parameterlosen Konstruktor haben (d. h Auch nützlich für die Datenbindung).

In Ihrem Fall sollte das XAML ungefähr so ​​aussehen:

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

Und der Code sollte sein:

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

HTH.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top