デフォルトのコンストラクターを持たないコントロールにXamlReaderを使用する

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

  •  22-09-2019
  •  | 
  •  

質問

XAMLオブジェクトの文字列表現がいくつかあり、コントロールを構築したいと思います。私は使用しています xamlreader.parse これを行う機能。パラメーターを使用しないデフォルトのコンストラクターがあるボタンなどの単純なコントロールの場合、これは正常に機能します。

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

ただし、ストロークコントロールをたとえばこれを行こうとすると、失敗します。最初に単純な空のストロークを試してみてください:

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」の公開デフォルトコンストラクターを持たないことが原因です。

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

私は何が間違っているのですか? XamlReaderにストロークを正しく作成する方法を伝えるにはどうすればよいですか?

役に立ちましたか?

解決

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

人々は使用します ObjectDataProvider XAMLでは、パラメーターのないコンストラクターを持たないクラスのインスタンスを「翻訳」してラップします(それは データバインディングにも役立ちます).

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top