Avalonia 样式 - 默认值不受伪类样式的影响

问题描述 投票:0回答:0

问题

我正在尝试改进我的

Sliders
(样式为推子)的用户体验。因此,每当用户将鼠标悬停在
Background
上时,我想更改
Thumb
Slider
。 (将来我-当然-想将其扩展为按下鼠标按钮。)第二个
Setter
中的
Style
-仅对
Pseudoclass
有效
:pointerover
-但是不会覆盖由第一个
Style
。这不仅适用于
Background
-
property
,而且对于第一个
property
中的任何
Style
设置也是如此:任何未由第一个
property
设置的
Style
(例如
Opacity
) 可以在第 2 次更改
Style
.

这是我的样式源代码

Sliders
。颜色在单独的
.axaml
文件中定义;因为我认为它们与这个问题无关,所以我不会将它们包括在我的问题中。如果访问此文件可以帮助您找到解决方案,我很乐意将其包含在这个问题中 - 所以请问:

<Styles xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Design.PreviewWith>
        <Border Background="{DynamicResource BGMain}">
            <Slider Classes="Fader" Height="250" />
        </Border>
    </Design.PreviewWith>


    <Style Selector="RepeatButton.trackfader">
        <Setter Property="Focusable" Value="False" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border Background="Transparent" Margin="0,-10" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- "1st style" -->
    <Style Selector="Slider.Fader">
        <Setter Property="Orientation" Value="Vertical" />
        
        <Setter Property="Maximum" Value="1" />
        <Setter Property="Minimum" Value="0" />
        
        <Setter Property="Width" Value="30" />

        <Setter Property="Background" Value="{DynamicResource SliderTrackBG}" />

        
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <Border Width="5" Background="{TemplateBinding Background}" CornerRadius="2"
                                Margin="0 20" /> <!-- height(indicator) / 2 - 5 -->


                        <Track x:Name="PART_Track" Orientation="Vertical">
                            <Track.DecreaseButton>
                                <RepeatButton x:Name="PART_DecreaseButton" Classes="trackfader"
                                              VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
                            </Track.DecreaseButton>
                            <Track.IncreaseButton>
                                <RepeatButton x:Name="PART_IncreaseButton" Classes="trackfader"
                                              VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
                            </Track.IncreaseButton>
                            
                            <Thumb x:Name="thumb">
                                <Thumb.Template>
                                    <ControlTemplate>
                                        <Border x:Name="thumbBorder" Height="50" BorderBrush="{DynamicResource SliderThumbMidColor}" BorderThickness="1">
                                            <Border.Background>
                                                <LinearGradientBrush StartPoint="0%,0%" EndPoint="0%,100%">
                                                    <LinearGradientBrush.GradientStops>
                                                        <GradientStop Offset="0" Color="{DynamicResource SliderThumbEndColor}" />
                                                        <GradientStop Offset="0.5" Color="{DynamicResource SliderThumbMidColor}" />
                                                        <GradientStop Offset="1" Color="{DynamicResource SliderThumbEndColor}" />
                                                    </LinearGradientBrush.GradientStops>
                                                </LinearGradientBrush>
                                            </Border.Background>


                                            <Rectangle Fill="{DynamicResource Accent80}" Height="3" />
                                        </Border>
                                    </ControlTemplate>
                                </Thumb.Template>
                            </Thumb>
                        </Track>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <!-- "2nd style" -->
    <Style Selector="Slider.Fader:pointerover /template/ Track > Thumb /template/ Border#thumbBorder">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0%,0%" EndPoint="0%,100%">
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Offset="0" Color="{DynamicResource SliderThumbEndHltColor}" />
                        <GradientStop Offset="0.5" Color="{DynamicResource SliderThumbMidHltColor}" />
                        <GradientStop Offset="1" Color="{DynamicResource SliderThumbEndHltColor}" />
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
</Styles>

我试过的

  • 我尝试将
    Background
    更改为
    SolidColorBrush
    而不是
    LinearGradientBrush
    。然而,结果保持不变。
  • 我将第二个
    Selector
    Style
    更改为(不)使用名称和/或针对
    descendents
    的不同
    Thumb
    ,例如
    Rectangle
    。问题依旧。
  • 我把第二个
    property
    改的
    Style
    改成了
    Opacity
    。这有效 - 如上所述。
  • 我把第二个
    property
    改的
    Style
    改成了
    BorderThickness
    。这没有用 - 如上所述。
  • 我在互联网上到处搜索 - 包括 stackoverflow - 寻找类似的问题。

我觉得问题是什么

对这种行为感到困惑,我在avalonia docs中寻求帮助。那里说

Styles
不能覆盖
local values
- 如果我对这句话的解释是什么:

为什么默认样式直接改变ContentPresenter Background属性,而不是改变Button.Background属性?
这是因为如果用户要在按钮上设置本地值,它将覆盖所有样式,并使按钮始终具有相同的颜色。有关详细信息,请参阅此已还原的 PR

在我看来,这正是这里发生的事情。但这并没有让我更接近解决方案,因为文档没有处理像我这样的情况,在这种情况下,我不想直接设计

Child
,而是在嵌套
descendent
中设计
Templates

提前感谢您的回答!

PS:有人可以为这样的问题创建一个

axaml
-标签,这样我就不必使用
xaml
了吗?

c# xaml styling avaloniaui
© www.soinside.com 2019 - 2024. All rights reserved.