3

Xaml オブジェクトの文字列表現がいくつかあり、コントロールを構築したいと考えています。これを行うためにXamlReader.Parse関数を使用しています。パラメーターを取らないデフォルトのコンストラクターを持つ Button などの単純なコントロールの場合、これは正常に機能します。

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

ただし、ストローク コントロールなどにこれを実行しようとすると失敗します。最初に単純な空の Stroke を試します:

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' のパブリックな既定のコンストラクターがないことが原因である可能性があります。

Stroke の定義では、少なくとも StylusPointsCollection を構築する必要があることがわかります。これはエラーが私に言っていることだと思いますが、これは XamlReader によって処理されると想定していました。StylusPoints を含む Stroke の 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);

私は何を間違っていますか?Stroke を正しく作成する方法を XamlReader に伝えるにはどうすればよいですか?

4

1 に答える 1

3

これは XAML 言語の "機能" であり、宣言型であり、コンストラクターについては何も知りません。

XAML でObjectDataProviderを使用して、パラメーターなしのコンストラクターを持たないクラスのインスタンスを "変換" してラップします (データ バインディングにも役立ちます)。

あなたの場合、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。

于 2010-02-25T17:10:28.367 に答える