如何定义 MarkupExtension 提供的值的类型?

How to define the type of a MarkupExtension provided value?

我在 xaml 中遇到一个问题,其中自定义 MarkupExtensionProvideValue returns 是一个字符串,但是 xaml “编译”没有我不知道并给出以下错误: A key for a dictionary cannot be of type 'MyNamespace.MyExtension'. Only String, TypeExtension, and StaticExtension are supported. 这个错误很不幸,因为我知道所提供的值实际上是一个字符串,根据错误消息,这是一个可接受的类型。这是重现错误的示例:

分机号:[=​​15=]

[MarkupExtensionReturnType(typeof(String))]
public class MyExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return "Hello World!";
    }
}

用法:

<sys:Double x:Key="{my:MyExtension}">99</sys:Double>

EDIT2:简化了问题,因为我在测试后发现它可能更具体

要解决您的问题,您可以使 MyExtension 继承自 StaticExtensionTypeExtension(均来自 System.Windows.Markup)。这看起来不太干净,因为 MyExtensionTypeExtensionStaticExtension 无关,但这是我所知道的绕过编译时检查的唯一方法,确保资源键只StringTypeExtensionStaticExtension.

类型

TypeExtensionStaticExtension 继承后,如果您直接从 MarkupExtension 继承(因此您只需覆盖 ProvideValue)您当前的实施。