是 Avalonia 风格的选择器
Is Selector in Avalonia Style
我有一个 baseButtonStyle,它应该适用于所有按钮和所有派生类型。它适用于所有按钮(不包括派生按钮)。
<Style x:Key="BaseButtonStyle" Selector="is Button" >
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{StaticResource SecondaryFontBrush}"/>
<Setter Property="BorderBrush" Value="{StaticResource BlueButtonNormalBorderBrush}"/>
<Setter Property="Background" Value="{StaticResource BlueButtonNormalBackgroundBrush}"/>
<Setter Property="UseLayoutRounding" Value="True"/>
<Setter Property="Padding" Value="10"/>
<Setter Property="Margin" Value="10"/>
</Style>
现在我有一个从 Button 派生的 AdditionalTextButton。
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
using System;
namespace VW7OrbMachineAvalonia1.Components.Controls
{
public class AdditionalTextButton : Button
{
Type IStyleable.StyleKey => typeof(AdditionalTextButton);
/// <summary>
/// Bottom left displayed Text
/// </summary>
public string BottomLeftText
{
get { return (string)GetValue(BottomLeftTextProperty); }
set { SetValue(BottomLeftTextProperty, value); }
}
public static readonly StyledProperty<String> BottomLeftTextProperty =
AvaloniaProperty.Register<AdditionalTextButton, String>("BottomLeftText");
}
}
我对 Avalonia 样式行为的理解是,由于 is Button
选择器,BaseButtonStyle 应该应用于 AdditionalTextButton。但这并没有发生。
除此之外,我还有另一种适用于所有 AdditionaltextButton 的样式。这也很好用。
<Style x:Key="additionalTextButtonStyle" Selector="is vwaui:Additionaltextbutton">
<Setter Property="FontSize" Value="22"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" TextWrapping="Wrap" Text="{TemplateBinding BottomLeftText}"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" Text="{TemplateBinding Content}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如何获得 AdditionalTextButton 由 BaseButtonStyle 和 AdditionalTextButtonStyle 设置样式的结果?来自 AdditionalTextButtonStyle 的设置器应该覆盖来自 BaseButtonStyle 的设置器。
Avalonia 没有直接继承样式的概念。 Avalonia 与 WPF、UWP 等最不同的地方是它的样式系统。 Avalonia 的样式系统更类似于 CSS。
因此,您可以使用 类.
来实现这一点
例如,假设您在 XAML 3 个按钮中声明:
<Button />
<Button Classes="buttonStyle1" />
<Button Classes="buttonStyle1 buttonStyle2" />
然后您可以添加如下样式:
<Style Selector="Button">
<Setter Property="FontSize" Value="12" />
</Style>
<Style Selector="Button.buttonStyle1">
<Setter Property="FontWeight" Value="Bold" />
</Style>
<Style Selector="Button.buttonStyle2">
<Setter Property="Foreground" Value="Red" />
</Style>
这样您就可以同时组合或继承多种样式。
如果您想显着改变外观,您也可以覆盖样式中的模板。
问题是您的 is
选择器语法错误。如果将其更改为:
Selector=":is(Button)"
和
Selector=":is(vwaui|Additionaltextbutton)"
那么这应该会按预期工作。
我有一个 baseButtonStyle,它应该适用于所有按钮和所有派生类型。它适用于所有按钮(不包括派生按钮)。
<Style x:Key="BaseButtonStyle" Selector="is Button" >
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{StaticResource SecondaryFontBrush}"/>
<Setter Property="BorderBrush" Value="{StaticResource BlueButtonNormalBorderBrush}"/>
<Setter Property="Background" Value="{StaticResource BlueButtonNormalBackgroundBrush}"/>
<Setter Property="UseLayoutRounding" Value="True"/>
<Setter Property="Padding" Value="10"/>
<Setter Property="Margin" Value="10"/>
</Style>
现在我有一个从 Button 派生的 AdditionalTextButton。
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
using System;
namespace VW7OrbMachineAvalonia1.Components.Controls
{
public class AdditionalTextButton : Button
{
Type IStyleable.StyleKey => typeof(AdditionalTextButton);
/// <summary>
/// Bottom left displayed Text
/// </summary>
public string BottomLeftText
{
get { return (string)GetValue(BottomLeftTextProperty); }
set { SetValue(BottomLeftTextProperty, value); }
}
public static readonly StyledProperty<String> BottomLeftTextProperty =
AvaloniaProperty.Register<AdditionalTextButton, String>("BottomLeftText");
}
}
我对 Avalonia 样式行为的理解是,由于 is Button
选择器,BaseButtonStyle 应该应用于 AdditionalTextButton。但这并没有发生。
除此之外,我还有另一种适用于所有 AdditionaltextButton 的样式。这也很好用。
<Style x:Key="additionalTextButtonStyle" Selector="is vwaui:Additionaltextbutton">
<Setter Property="FontSize" Value="22"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" TextWrapping="Wrap" Text="{TemplateBinding BottomLeftText}"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" Text="{TemplateBinding Content}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如何获得 AdditionalTextButton 由 BaseButtonStyle 和 AdditionalTextButtonStyle 设置样式的结果?来自 AdditionalTextButtonStyle 的设置器应该覆盖来自 BaseButtonStyle 的设置器。
Avalonia 没有直接继承样式的概念。 Avalonia 与 WPF、UWP 等最不同的地方是它的样式系统。 Avalonia 的样式系统更类似于 CSS。
因此,您可以使用 类.
来实现这一点例如,假设您在 XAML 3 个按钮中声明:
<Button />
<Button Classes="buttonStyle1" />
<Button Classes="buttonStyle1 buttonStyle2" />
然后您可以添加如下样式:
<Style Selector="Button">
<Setter Property="FontSize" Value="12" />
</Style>
<Style Selector="Button.buttonStyle1">
<Setter Property="FontWeight" Value="Bold" />
</Style>
<Style Selector="Button.buttonStyle2">
<Setter Property="Foreground" Value="Red" />
</Style>
这样您就可以同时组合或继承多种样式。
如果您想显着改变外观,您也可以覆盖样式中的模板。
问题是您的 is
选择器语法错误。如果将其更改为:
Selector=":is(Button)"
和
Selector=":is(vwaui|Additionaltextbutton)"
那么这应该会按预期工作。