Как наследовать стиль XAML и переопределить свойство дочернего элемента? - PullRequest
20 голосов
/ 07 сентября 2010

мы только начали работать с XAML и все еще боремся с основными проблемами: Исходя из CSS, мы хотели бы определить общий стиль кнопки с помощью пользовательского шаблона элемента управления, а затем иметь второй стиль, который наследует все от первого стиля, используя «basedon». Этот второй стиль должен затем переопределять свойства, например «цвет переднего плана» (который работает) но также свойства дочерних элементов в нашем пользовательском шаблоне, такие как «цвет фона», например, включенного элемента границы и т. д. (который не работает).

Каков общий подход к таким вещам? Как далеко мы можем пойти с каскадными стилями?

Ура! * * 1005

Ответы [ 3 ]

30 голосов
/ 01 февраля 2011

Вы можете использовать унаследованный стиль без ссылки на ключ:

<Grid>
    <Grid.Resources>
        <!-- Definition of default appearance of a button -->
        <Style TargetType="Button" x:Key="Default">
            <Setter Property="Background" Value="Red"></Setter>
            <Setter Property="FontFamily" Value="Segoe Black" />
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="FontSize" Value="32pt" />
            <Setter Property="Foreground" Value="#777777" />
        </Style>
        <!-- Define general style that based is base on the default style of the button without a key reference-->
        <Style TargetType="Button" BasedOn="{StaticResource Default}"/>

        <!-- In sub style override the properties you need -->
        <Style BasedOn="{StaticResource Default}" TargetType="Button" x:Key="SubButton" >
            <Setter Property="FontSize" Value="8pt" />
        </Style>

    </Grid.Resources>

    <Button Content="Main" Height="51" HorizontalAlignment="Left" Margin="154,72,0,0" Name="button1" VerticalAlignment="Top" Width="141" />
    <Button Content="Sub" Style="{StaticResource SubButton}" Height="51" HorizontalAlignment="Left" Margin="154,162,0,0" Name="button2" VerticalAlignment="Top" Width="141" />
</Grid>
17 голосов
/ 19 апреля 2016

У меня (в моем приложении WPF) стандартные (базовые) стили, определенные в ResourceDictionary в App.xaml (в стартовом проекте). Например, для кнопки следующим образом.

    <Style TargetType="Button">
        <Setter Property="Margin" Value="5"/>
        <Setter Property="FontWeight" Value="DemiBold"/>
        <Setter Property="FontSize" Value="16"/>
    </Style>

Во всех представлениях я использую (по умолчанию) этот общий стиль (автоматически наследуется)! Когда мне нужно изменить или добавить какое-либо свойство в стиле по умолчанию (определенном в App.xaml), я создаю новый стиль на основе стиля по умолчанию.

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
        <!-- change -->
        <Setter Property="Margin" Value="10" />
        <!-- add -->
        <Setter Property="Foreground" Value="Red" />
    </Style>

Когда мне нужно скрыть или строго переопределить стиль по умолчанию (в некоторых представлениях), я создаю новый стиль (на основе ничего).

    <Style TargetType="Button"/>

Конечно, вы можете продолжить наследование в App.xaml или в специальном представлении. Вы можете основывать новый стиль с именем на стиле по умолчанию и использовать новый стиль по имени. Например, стиль RedButton и GreenButton.

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="RedButton">
        <Setter Property="Foreground" Value="Red" />
    </Style>

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="GreenButton">
        <Setter Property="Foreground" Value="Green" />
    </Style>

Etc ...

ПРИМЕЧАНИЕ. Вместо того, чтобы определять свой стиль в App.xaml, вы можете использовать автономную библиотеку (dll) только со стилями и ResourceDictionary из вашей библиотеки в App.xaml ResourceDictionary.MergedDictionaries.

8 голосов
/ 07 сентября 2010

Стандартный подход к созданию настраиваемого шаблона элемента управления заключается в использовании TemplateBinding в шаблоне для привязки к свойствам элемента управления, а затем для установки этих свойств в дочерних стилях.

Например, создается шаблон кнопки с элементом управления «Граница» и привязывается фон «Граница» к свойству «Фон» кнопки.Устанавливая свойство Background для Button в других стилях, оно меняет свойство Background для Border.

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseButtonStyle" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}">
                            <ContentPresenter/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="BlueButtonStyle" TargetType="Button"
               BasedOn="{StaticResource BaseButtonStyle}">
            <Setter Property="Background" Value="Blue"/>
        </Style>
        <Style x:Key="RedButtonStyle" TargetType="Button"
               BasedOn="{StaticResource BaseButtonStyle}">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </StackPanel.Resources>
    <Button Style="{StaticResource RedButtonStyle}">Red</Button>
    <Button Style="{StaticResource BlueButtonStyle}">Blue</Button>
</StackPanel>

Многие свойства элемента управления предназначены для использования в шаблонах элементов управления и не влияют на другое поведение при их изменении.Это BorderBrush, BorderThickness, Background, Padding, HorizontalContentAlignment и VerticalContentAlignment.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...