【问题标题】:How does one use the UWP MarkupExtension class?如何使用 UWP MarkupExtension 类?
【发布时间】:2017-11-07 11:28:49
【问题描述】:

Fall Creators 更新 SDK 添加了一个标记扩展类,很棒。 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()
    {
        ...
    }
}

我尝试以这样的方式使用它:

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

现在,这将正确调用我的 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,所以也许我是……)

【问题讨论】:

  • 缺少的手册可能是located here。我不太了解,但应用属性是我尝试的第一件事。

标签: c# uwp markup-extensions


【解决方案1】:

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

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

【讨论】:

  • 谢谢 - 这实际上是答案 - 我已经这样做了,但事实证明我在这种情况下使用了完全错误的 Unicode 格式。虽然我最终还是使用 x:Bind 绑定到静态值,因为我想在 DataTemplates 中使用 x:Bind 时通过静态转换器函数运行它们......摆动和回旋处! (这些天试图完全避免使用 IValueConverters)
  • @Michael 怎么了,谢谢你的回答。我无法从扩展访问绑定值,即&lt;TextBox IsEnabled="{Binding IsBusy, Converter={ex:Negator}}"/&gt;,我可以在 UWP 中以某种方式实现此功能吗?我希望从base.ProvideValue 获得绑定值,但它总是返回null
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 2013-01-22
  • 2010-09-27
  • 2011-07-13
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2011-08-14
相关资源
最近更新 更多