Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不带转换器和标记扩展的速记语法在XAML中分配属性_Xaml - Fatal编程技术网

使用不带转换器和标记扩展的速记语法在XAML中分配属性

使用不带转换器和标记扩展的速记语法在XAML中分配属性,xaml,Xaml,我有一个像这样的XAML <ml:Visualizer Smooth="True" /> <ml:Visualizer> <ml:Visualizer.Effect> <thirdParty:Smoothing/> </ml:Visualizer.Effect> </ml:Visualizer> 最近,我们添加了不同类型的预处理,如平滑、模糊、锐化等。 现在我们这样写 <ml:V

我有一个像这样的XAML

<ml:Visualizer Smooth="True" />
<ml:Visualizer>
    <ml:Visualizer.Effect>
        <thirdParty:Smoothing/>
    </ml:Visualizer.Effect>
</ml:Visualizer>

最近,我们添加了不同类型的预处理,如平滑、模糊、锐化等。 现在我们这样写

<ml:Visualizer Smooth="True" />
<ml:Visualizer>
    <ml:Visualizer.Effect>
        <thirdParty:Smoothing/>
    </ml:Visualizer.Effect>
</ml:Visualizer>

是否可以将属性指定为XML属性,但可能无需编写自定义类型转换器或MarkupExtensions。我们的目标是有一个简短的语法来分配属性,但是实际效果可以稍后由第三方作为DLL提供,我们需要在XAML中引用它们

<ml:Visualizer Effect="{thirdParty:Smoothing}" /> <!-- BUT WITH NO CUSTOM MARKUP EXTENSION -->

如果确实有可能,那么下一个级别将是设置效果的属性(即使只有默认构造函数可用)


我知道它看起来像一个标记扩展,但是为每个引入的效果编写一个单独的标记扩展太繁琐了。看起来太基本了,没有解决方案:)

有什么建议吗


提前谢谢

如果您只需要知道要创建的对象的类型,可以使用现有的
类型
标记扩展:

Effect="{x:Type thirdParty:Smoothing}"
或者,如果需要对象的实例(即现有标记正在创建的对象),可以使用与转换器使用的方法类似的方法,即将效果创建为资源,并按名称引用:

<Window.Resources>
     <thirdParty:Smoothing x:Key="myEffect" />
</Window.Resources>
....
<ml:Visualizer Effect="{StaticResource myEffect}" />

....

您试图实现的语法是为自定义标记扩展定义的语法,因此要求在没有扩展的情况下这样做等同于要求调用C语言中的
MyNonexistentMethod()
,而不定义方法,也不期望它只执行您想要的操作。如果您只是试图避免编写多个标记扩展,那么只需编写一个可以重用的扩展即可。如果您可以使不同的效果遵循一个通用模式(默认构造函数、接收参数的通用方式)然后,您可以将一个类型和一些其他设置参数传递给标记扩展,让它创建该类型的实例,并为您在任何当前或将来的类型上设置参数。

完全可以在没有任何标记扩展的情况下执行此操作。 语法是
SomeProp=“{YourClass}”
SomeProp=“{YourClass Prop=Value}”
为SomeProp指定类的实例

示例(在.Net 4.0上验证):


使用System.IO;
使用System.Xaml;
使用制度;
命名空间XamleExperiments
{
班级计划
{
静态void Main(字符串[]参数)
{
var xamlText=
@"
";
var computer=(computer)XamlServices.Load(newstringreader(xamlText));
计算机处理();
}
}
公共类计算机
{
公共历史存储{get;set;}
public void进程(){Storage.Store();}
}
公共接口历史记录
{
无效存储();
}
公共级硬盘驱动器:IStorage
{
公共双千兆字节{get;set;}
public void Store(){Console.WriteLine(“存储在硬盘上的1GB”);}
}
}
输出为:
在硬盘上存储1GB


请注意,没有任何标记扩展您只需使用简单的
{HardDrive Gigabytes=2.5}

即可实例化硬盘实例。不幸的是,我使用的是纯System.Xaml(根本不涉及WPF/SL),而且在这种情况下不可能使用静态或动态资源功能。我想我要问的功能是一个不存在的“nice2have”速记语法,例如
可能是一个
IValueConverter
,它知道如何将字符串转换成合适的对象?我可以看出这是可行的,不过老实说,我怀疑多个自定义标记扩展会更有意义。我明白你的意思,我所问的语法根本不存在。您的变通方法可以工作,但是仍然有点多余
在分配给类型属性时,x:Type并不是严格必需的,因为默认转换将处理它,但是使用它进行编译时检查是很好的。令人惊讶的是,
MyNoneExistentMethod()
”实际上存在。可能是System.Xaml带来的增强。AFAIK在WPF 3.5中确实没有。请在答案中找到更多细节。