Pergunta

Eu tenho algumas representações de string de objetos XAML e quero criar os controles. Estou usando o Xamlreader.parse função para fazer isso. Para um controle simples, como o botão que possui um construtor padrão que não pegue nenhum parâmetros, isso funciona bem:

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

No entanto, quando tento fazer isso para, por exemplo, um controle de derrame, ele falha. Primeiro tentando um golpe vazio simples:

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

Isso dá o erro:

Não é possível criar objeto do tipo 'system.windows.ink.stroke'. O CreateInstance falhou, que pode ser causado por não ter um construtor de padrão público para 'System.Windows.ink.stroke'.

Na definição de derrame, vejo que ele precisa de pelo menos um StylusPointScollection para ser construído. Presumo que seja isso que o erro está me dizendo, embora estivesse meio que assumindo que isso seria tratado pelo XamlReader. Tentando transformar um xaml de golpe com os pontos de STYLUSTES, dá o mesmo erro:

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

O que estou fazendo errado? Como digo ao XamlReader como criar o golpe corretamente?

Foi útil?

Solução

É um "recurso" do idioma XAML, é declarativo e não sabe nada sobre construtores.

As pessoas usam ObjectDataProvider em xaml para "traduzir" e envolver instâncias de classes que não possuem um construtor sem parâmetros (é Também útil para ligação de dados).

No seu caso, o XAML deve parecer aproximadamente assim:

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

E o código deve ser:

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

Hth.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top