Avalonia开发实践(四)——关于Setter优先级的问题

首先看一段样例代码:

<StackPanel Orientation="Horizontal" Spacing="50" HorizontalAlignment="Center">
	<StackPanel.Styles>
		<Style Selector="Button.default">
			<Setter Property="Background" Value="Red"/>
		</Style>
	</StackPanel.Styles>
	
	<!--Left Button-->
	<Button Classes="default" Width="100" Height="100" Background="Blue"/>

	<!--Right Button-->
	<ContentControl>
		<ContentControl.Template>
			<ControlTemplate>
				<Button Classes="default" Width="100" Height="100" Background="Blue"/>
			</ControlTemplate>
		</ContentControl.Template>
	</ContentControl>
</StackPanel>

这段代码中有两个Button,且它们的属性值一模一样,只不过一个在LogicalTree中,一个在ControlTemplate中。仅仅这个区别,使得它们的呈现效果完全不一样,如下图:

左侧Button的Background生效了,而右侧Button的Background值没有生效,为什么会这样?

这里就不得不说Avalonia的Setter优先级机制了,官方给出的优先级清单如下:

Animation = -1, // Highest priority
LocalValue = 0,
StyleTrigger,
Template,
Style,
Inherited,
Unset = int.MaxValue, // Lowest priority

从上面可以看到,StyleTrigger的优先级是高于Template的,所以尽管在Template中设置了Background,但它的优先级和Template是等同的,因此优先级仍然没有Style中的Background高。

这一点我也在Github上得到了明确的解答,原回答如下:

简而言之就是,在Template中是没有办法覆盖Style中设置的属性的!!


以上案例也凸显了Avalonia和WPF的属性值优先级的不同。

在WPF中,Template的属性值优先级是高于Style的,官方文档如下:

依赖项属性值优先级 - WPF .NET | Microsoft Learn

可以编写对比代码进行验证这一点:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    <StackPanel.Resources>
        <Style x:Key="DefaultButton" TargetType="Button">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </StackPanel.Resources>

    <!--Left Button-->
    <Button Style="{StaticResource DefaultButton}" Width="100" Height="100" Background="Blue"/>

    <!--Right Button-->
    <ContentControl Margin="50,0,0,0">
        <ContentControl.Template>
            <ControlTemplate>
                <Button Style="{StaticResource DefaultButton}" Width="100" Height="100" Background="Blue"/>
            </ControlTemplate>
        </ContentControl.Template>
    </ContentControl>
</StackPanel>

效果如下:

两个按钮都被设置成了蓝色! 

上一篇:Avalonia开发实践(三)——实现GroupBox

下一篇:Avalonia开发实践(五)——如何用后台代码创建模板


欢迎观看我的博客,还有什么想在Avalonia实现的效果或遇到的问题都可以评论或留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值