Селектор в стиле Авалония - PullRequest
       14

Селектор в стиле Авалония

0 голосов
/ 15 октября 2018

У меня есть 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>

Теперь у меня есть AdditionalTextButton, полученный из Button.

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.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Проблема в том, что ваш синтаксис селектора is неверен.Если вы измените его на:

Selector=":is(Button)"

и

Selector=":is(vwaui|Additionaltextbutton)"

, тогда это должно работать как ожидалось.

0 голосов
/ 16 октября 2018

В Avalonia нет концепции наследования стилей напрямую.Район, который Avalonia отличается от WPF, UWP и т. Д., - это система стилей.Система стилей Avalonia больше похожа на CSS.

Так что для достижения этого вы можете использовать классы.

Например, например, вы объявляете в XAML 3 кнопки:

<Button />
<Button Classes="buttonStyle1" />
<Button Classes="buttonStyle1 buttonStyle2" />

youзатем можно добавить такие стили, как:

<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>

Таким образом, вы можете создавать или наследовать несколько стилей одновременно.

Вы также можете переопределить шаблон в стиле, если вы хотите существенно изменить внешний вид.

...