2017-11-07 12 views
0

秋のクリエイターアップデートSDKは、マークアップ拡張クラスを追加しました。 https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.markup.markupextensionUWP MarkupExtensionクラスはどのように使用されますか?

だから私はオーバーライドと "ProvideValue"メソッドを作成します。

私のスタイルでそのように使用しようとする
public class MDL2 : MarkupExtension 
{ 
    ... 

    public string Target { get; set; } 

    protected override object ProvideValue() 
    { 
     ... 
    } 
} 

<Setter Property="IconGlyph" Value="{u:MDL2 Target='Delete'}" /> 

さて、これは正しく私のMDL2拡張のためのコンストラクタを呼び出し、削除」の文字列値にTargetプロパティを設定します"ここまでは順調ですね。

ただし、ProvideValueオーバーライドが呼び出されることはありません。IconGlyphのTemplateBindingにアクセスすると、実際にはマークアップ拡張から値を取得しようとする試みは一切ありません。System.Runtime.InteropServices.COMException: Error HRESULT E_FAIL has been returned from a call to a COM component. at Windows.UI.Xaml.FrameworkElement.MeasureOverride(Size availableSize)が表示されます。

実際に何が起きているのかは、ProvideValueメソッドを呼び出す代わりに、実際にはプロパティ値もMarkupExtensionのインスタンスに設定しています。これは非常に望ましくないものでも、マークアップ拡張がうまくいくとは思わないでしょう。

だから私はおそらくこれに多くの答えはないだろうと知っていますが、誰もこのクラスで遊んでいて、UWPでうまく動作していますか?これは期待されていますか?私は私の使い方に戸惑っていますか?

(ので、おそらく私は...だ前に私が実際にどのような形態でMarkupExtensionを使用したことがない)

+0

不足しているマニュアルはあるかもしれません[ここにある](https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/markup-extensions-for-xaml-overview)私はそれの多くを理解していませんが、属性を適用することが私が試してみたい最初のことです。 –

答えて

1

あなたのクラスにMarkupExtensionReturnType属性を追加する必要があります。

[MarkupExtensionReturnType(ReturnType = typeof(string))] 
public class MDL2 : MarkupExtension 
{ 
+0

ありがとうございます - これは実際には答えです - 私はすでにそれをやっていましたが、このケースではまったく間違ったUnicodeフォーマットを使用していました。とにかくx:Bindを使って静的な値にバインドしてしまったのですが、x:BindをDataTemplates ... swingとroundaboutsで使用するときは静的コンバータ関数を使用してそれらを実行したかったようです。 (最近、IValueConvertersの使用を完全に避けようとしています) –

関連する問題