如何使用 UWP MarkupExtension 类?

Joh*_*ake 5 c# markup-extensions uwp

Fall Creators update SDK 添加了一个 Markup Extension 类,很棒。https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.markup.markupextension

所以我创建了一个并覆盖了“ProvideValue”方法。

public class MDL2 : MarkupExtension
{
    ...

    public string Target { get; set; }

    protected override object ProvideValue()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试以一种风格使用它:

<Setter Property="IconGlyph" Value="{u:MDL2 Target='Delete'}" />
Run Code Online (Sandbox Code Playgroud)

现在,这将正确调用我的 MDL2 扩展的构造函数,并将 Target 属性设置为字符串值“Delete”。到现在为止还挺好。

除了,从不调用 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 所以也许我是......)

Mic*_*SFT 6

您需要将MarkupExtensionReturnType属性添加到您的类中:

[MarkupExtensionReturnType(ReturnType = typeof(string))]
public class MDL2 : MarkupExtension
{
Run Code Online (Sandbox Code Playgroud)

  • @Shimmy看到这个要点:https://gist.github.com/michael-hawker/6d49e014015a8e122670437bd5c20fc1 (2认同)