XAML将样式与工具包中的样式相结合。

12 浏览
0 Comments

XAML将样式与工具包中的样式相结合。

在WPF中,我如何将多个样式应用于FrameworkElement?例如,我有一个控件已经有了一个样式。我还有一个单独的样式,我想要将其添加到该控件中而不会覆盖掉第一个样式。这些样式有不同的TargetTypes,因此我不能简单地用一个样式扩展另一个样式。

0
0 Comments

问题的原因是在XAML中,只能基于具有相同目标类型(TargetType)的样式进行继承。如果尝试基于不同类型的样式进行继承,将会出现错误。

解决方法是使用BasedOn属性,并确保要继承的样式具有相同的目标类型。通过将BasedOn属性设置为StaticResource,可以继承来自XAML工具包(Toolkit)或其他资源字典中的样式。

以下是解决问题的代码示例:



通过将AlwaysVerticalStyle样式的BasedOn属性设置为"{x:Type TextBlock}",可以继承基本TextBlock样式的所有设置,并在此基础上添加额外的垂直对齐设置。

这样,就可以通过组合不同样式来实现从工具包或其他资源中继承样式的目的。

0
0 Comments

在WPF和Silverlight中,可以通过"BasedOn"属性从另一个Style派生出一个Style。这个特性使得开发者可以使用类似类继承的层次结构来组织他们的样式。但是,WPF和Silverlight都没有提供一种在一个元素上设置多个样式的解决方案。本文介绍了一种使用自定义标记扩展来实现合并多个样式的方法。

作者首先创建了一个名为MultiStyleExtension的类,该类继承自MarkupExtension,并使用了MarkupExtensionReturnType属性来指示返回的值类型为Style。

接下来,作者想要给MarkupExtension的用户提供一种简单的方式来指定要合并的样式。他使用了一个带有可变参数的构造函数来接收样式的资源键。但是,由于自定义标记扩展不支持无限数量的构造函数参数,所以作者采用了将样式名称用空格分隔的方式作为构造函数参数的解决方案。

为了计算MarkupExtension的输出,作者重写了MarkupExtension的ProvideValue方法。在这个方法中,作者使用了一个名为Merge的扩展方法来合并两个样式。这个方法将第一个样式修改为包含第二个样式的所有信息。如果存在冲突(例如,两个样式都为同一个属性设置了Setter),则第二个样式将覆盖第一个样式的设置。

为了获取实际的样式实例,作者创建了一个StaticResourceExtension。通过使用这个扩展,作者可以根据样式的资源键获取样式实例。

最后,作者展示了如何使用MultiStyle扩展来合并多个样式。在Window.Resources中定义了几个样式,然后在Button的Style属性中使用MultiStyle来合并这些样式。

这篇文章介绍了一种使用自定义标记扩展来合并多个样式的方法。通过重写MarkupExtension的ProvideValue方法,作者实现了合并多个样式的逻辑,并展示了如何在XAML中使用这个自定义扩展来实现样式的合并。

关于问题的原因,文章并没有明确提及。问题可能是因为WPF和Silverlight没有提供直接合并多个样式的解决方案,需要借助自定义标记扩展来实现。

至于问题的解决方法,文章提供了一种使用自定义标记扩展的解决方案。通过创建一个继承自MarkupExtension的类,并重写ProvideValue方法来实现样式的合并。通过创建一个StaticResourceExtension来获取实际的样式实例,并使用Merge方法来合并多个样式。

最后,文章给出了一个完整的示例,展示了如何使用MultiStyle扩展来合并多个样式,并在Button的Style属性中使用这个扩展来应用合并后的样式。

0
0 Comments

问题的原因是在WPF中,一个元素只能应用一个Style。然而,通过使用BasedOn属性,我们可以实现一种解决方法。下面是一段示例代码,其中我定义了一个基础样式,并在第二个样式中使用BasedOn属性继承基础样式并设置另一个属性。


    
        
        
    
    
        

需要注意的是,如果在第二个样式中将TargetType更改为ButtonBase,两个样式将不会被应用。为了解决这个限制,我们可以给样式一个Key,并使用该Key引用它。


    
        
        
    
    
        

需要注意的是,derivedStyle必须在baseStyle之后定义,顺序很重要。

0