1

我很确定答案是否定的,但是有没有办法以不同于实现它的类命名标记扩展?

我想制作一个名称相对较短的标记扩展:

<TextBlock Text="{my:Ext}"/>

但我想在 C# 端给它一个不同的(更长的)名称:

public class MySpecificMarkupExtension : MarkupExtension

我发现的关于命名的唯一信息是在这个页面*Extension模式上,这不是我想要实现的。我希望存在一个允许我这样做的属性:

[SomeAttribute("Ext")]
public class MySpecificMarkupExtension : MarkupExtension

但是我检查了System.Windows.Markup 命名空间中的大多数属性,不幸的是没有这样的属性。

这个问题有什么解决办法吗?

4

1 回答 1

2

答案是您可能已经假设 NOPE。没有这样的类属性。我不知道。

既然您提到您有大量异常,并且您希望使 xaml 尽可能简单,那么您是否只有一个基于密钥调用其他扩展的扩展。

就像将所有这些扩展隐藏在某个键后面一样。

看看这个:

public class MyExtExtension : MarkupExtension
{
    public string Output
    {
        get; set;
    }

    public MyExtExtension(string output)
    {
        this.Output = output;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this.Output;
    }
}

public class MarkupExtensionChooser : MarkupExtension
{
    public string Key
    {
        get;
        set;
    }

    public StringList Param
    {
        get; set;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (this.Key.Equals("ext"))
        {
            return new MyExtExtension(this.Param.Data[0]).ProvideValue(serviceProvider);
        }

        if (this.Key.Equals("ext123"))
        {
            // Custom Logic
        }

        if (this.Key.Equals("ext123123123"))
        {
            // Custom Logic
        }

        if (this.Key.Equals("ext123123123"))
        {
            // Custom Logic
        }

        if (this.Key.Equals("ext12121412423"))
        {
            // Custom Logic
        }

        return this;
    }
}

public class StringListTypeConverter : TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            string val = (string)value;
            return new StringList(val.Split(','));
        }

        return null;
    }
}

[TypeConverter(typeof(StringListTypeConverter))]
public class StringList
{
    public string[] Data
    {
        get; set;
    }

    public StringList(string[] data)
    {
        this.Data = data;
    }
}

我最终创建了那个“选择器类”,它也可以接受参数并基于键返回必要的扩展。

TypeConverter 只是为了允许Param="args1,args2,args3"在 xaml 中使用。

这就是我在主窗口中的示例的样子:

<TextBox Text="{local:MarkupExtensionChooser Key=ext, Param='hello,world'}"/>

Hello将显示在 TextBox 中,因为我将 param[0] 传递给 MyExtExtension。

它对我来说很好,但我不确定你是否可以使用这样的东西。

这个想法很简单,但最后它背后有一点 wpf 欺骗,如果你不能理解,请告诉我。我很乐意再为您提供帮助。

于 2014-03-11T08:08:41.823 回答