L'utilisation XamlReader pour les contrôles qui ne dispose pas d'un constructeur par défaut

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

  •  22-09-2019
  •  | 
  •  

Question

J'ai quelques représentations de chaîne d'objets XAML, et je veux construire les commandes. J'utilise la fonction XamlReader.Parse pour le faire. Pour un contrôle simple tel que Button qui a un constructeur par défaut ne prenant aucun paramètre ceci fonctionne très bien:

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

Cependant, lorsque je tente de le faire à, par exemple un contrôle de la course elle échoue. Tout d'abord essayer simple vide Stroke:

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

Cela donne l'erreur:

  

Impossible de créer un objet de type 'System.Windows.Ink.Stroke'. CreateInstance échoué, ce qui peut être causée par ne pas avoir un constructeur par défaut public pour « System.Windows.Ink.Stroke ».

Dans la définition de l'AVC, je vois qu'il a besoin d'au moins un StylusPointsCollection à construire. Je suppose que c'est ce que l'erreur me dit, mais assumait un peu ce serait gérée par le XamlReader. Essayer de transformer une Xaml de course avec StylusPoints en donne la même erreur:

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'est-ce que je fais mal? Comment puis-je le dis XamlReader comment créer correctement l'accident vasculaire cérébral?

Était-ce utile?

La solution

Il est une « caractéristique » de la langue XAML, il est déclarative et ne sait rien sur les constructeurs.

Les gens utilisent ObjectDataProvider en XAML à « traduire » et envelopper des instances de classes qui ne disposent pas d'un constructeur parameterless (il est également utile pour les données de liaison ).

Dans votre cas, le XAML devrait ressembler à peu près comme ceci:

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

Et le code doit être:

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

HTH.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top