0

我有一个 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 样式行为的理解是,由于选择器,BaseButtonStyle 应该适用于 AdditionalTextButton is Button。但这不会发生。

除此之外,我还有另一种适用于所有 AdditionaltextButtons 的样式。这也很好用。

<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 的设置器。

4

2 回答 2

2

问题是您的is选择器语法错误。如果您将其更改为:

Selector=":is(Button)"

Selector=":is(vwaui|Additionaltextbutton)"

那么这应该可以按预期工作。

于 2018-10-19T09:55:22.157 回答
0

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>

通过这种方式,您可以一次组合或继承多个样式。

如果您想显着改变外观,也可以覆盖样式中的模板。

于 2018-10-16T11:59:18.913 回答