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 をできるだけシンプルに保ちたいとおっしゃっていたので、キーに基づいて他の拡張機能を呼び出す拡張機能を 1 つだけ用意するのはどうですか。

特定のキーの背後にあるすべての拡張機能を隠すようなものです。

これを見てください:

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 は、xaml で使用できるようにするためのものParam="args1,args2,args3"です。

これは、メインウィンドウの私の例がどのように見えるかです:

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

HellomyExtExtension に param[0] を渡すので、TextBox に表示されます。

私には問題なく動作しますが、このようなものを使用できるかどうかはわかりません。

アイデアは非常に単純ですが、最終的にはこれの背後にある wpf のトリックが少しあります。フォローできない場合はお知らせください。喜んでお手伝いさせていただきます。

于 2014-03-11T08:08:41.823 に答える