标记扩展命名
本文关键字:扩展 | 更新日期: 2023-09-27 17:49:26
我很确定答案是没有,但是是否有一种方法来命名一个标记扩展不同于实现它的类?
我想做一个标记扩展,有一个相对较短的名称:
<TextBlock Text="{my:Ext}"/>
,但我想给它一个不同的(更长的)名称在c#方面:
public class MySpecificMarkupExtension : MarkupExtension
我发现关于命名的唯一信息是在这个页面和*Extension
模式,这不是我想要实现的。我希望存在一个允许我这样做的属性:
[SomeAttribute("Ext")]
public class MySpecificMarkupExtension : MarkupExtension
但是我检查了System.Windows.Markup命名空间中的大多数属性,不幸的是没有这样的属性。
这个问题有解决办法吗?
答案是否定的。没有这样的类属性。我不知道。
既然你提到你有大量的异常,你想保持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的存在就是为了允许在xaml中使用Param="args1,args2,args3"
。
这是我的例子在主窗口看起来像:
<TextBox Text="{local:MarkupExtensionChooser Key=ext, Param='hello,world'}"/>
Hello
将显示在文本框中,因为我传递参数[0]给MyExtExtension。
这对我来说很好,但我不确定你是否可以使用这样的东西。
这个想法很简单,但最终它背后有一点wpf技巧,如果你不能跟上,让我知道。我很乐意为您提供进一步的帮助。