我正在尝试改进我的
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
。这没有用 - 如上所述。对这种行为感到困惑,我在avalonia docs中寻求帮助。那里说
Styles
不能覆盖 local values
- 如果我对这句话的解释是什么:
为什么默认样式直接改变ContentPresenter Background属性,而不是改变Button.Background属性?
这是因为如果用户要在按钮上设置本地值,它将覆盖所有样式,并使按钮始终具有相同的颜色。有关详细信息,请参阅此已还原的 PR。
在我看来,这正是这里发生的事情。但这并没有让我更接近解决方案,因为文档没有处理像我这样的情况,在这种情况下,我不想直接设计
Child
,而是在嵌套 descendent
中设计 Templates
。
提前感谢您的回答!
PS:有人可以为这样的问题创建一个
axaml
-标签,这样我就不必使用xaml
了吗?