Изменить свойство "супер / базовый" стиль wpf - PullRequest
1 голос
/ 01 июля 2011

Я создаю базовый стиль.Я использую наследование для реализации моего базового стиля.Я знаю, как добавить свойства в свой производный класс, но я не знаю, как просто изменить свойство.Позвольте мне привести пример:

допустим, у меня есть этот базовый стиль:

        <!-- SrollViewer ScrollBar Repeat Buttons (at each end) -->
    <Style x:Key="ScrollBarLineButton" TargetType="{x:Type RepeatButton}">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type RepeatButton}">
                    <Border
                        Name="Border"
                        Margin="1"
                        CornerRadius="2"
                        Background="WhiteSmoke"          
                        BorderThickness="1">
                        <Image Stretch="Uniform" Source="/FilesPro;component/Images/scrollArrow.png" Height="40" VerticalAlignment="Center" HorizontalAlignment="Center" Width="52" >
                            <Image.RenderTransform>
                                <TransformGroup>
                                    <ScaleTransform ScaleY="-1" />
                                    <TranslateTransform Y="40"/>
                                    <SkewTransform/>
                                    <RotateTransform/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </Image.RenderTransform>
                        </Image>
                        <!--
                        <Path
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            Fill="{StaticResource GlyphBrush}"
                            Data="{Binding Path=Content,
                                RelativeSource={RelativeSource TemplatedParent}}" >
                        </Path>
                        -->
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

Я хотел бы создать новый стиль, который имеет те же свойства, что и ScrollBarLineButton, но с изображением transfromscaleY = 1 вместо -1.

когда я делаю:

        <Style x:Key="ScrollBarLineButtonVerticalUp" BasedOn="{StaticResource ScrollBarLineButton}" TargetType="{x:Type RepeatButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type RepeatButton}">
                    <Border>                            
                        <Image Stretch="Uniform" Source="/FilesPro;component/Images/scrollArrow.png" Height="40" VerticalAlignment="Center" HorizontalAlignment="Center" Width="52" >
                            <Image.RenderTransform>
                                <TransformGroup>
                                    <ScaleTransform ScaleY="1" />
                                     ....
                                     ...

Граница больше не имеет базового поля стиля, цвета фона и т. Д. Как я могу наследовать от стиля и просто изменить одно свойство.Я знаю, что могу скопировать пасту, но я это очень сильно изменю, и это удобно, если я изменю это в одном месте, оно изменится во всех других местах.

1 Ответ

6 голосов
/ 01 июля 2011

Вы можете создать ссылку DynamicResource, чтобы сделать что-то подобное, вот пример:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="ButtonStyleA" TargetType="{x:Type Button}">
            <Style.Resources>
                <SolidColorBrush x:Key="TextBrush" Color="Yellow" />
            </Style.Resources>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border CornerRadius="10" BorderThickness="1" BorderBrush="Red">
                            <ContentPresenter TextElement.Foreground="{DynamicResource TextBrush}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Key="ButtonStyleB" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyleA}">
            <Style.Resources>
                <SolidColorBrush x:Key="TextBrush" Color="Blue" />
            </Style.Resources>
        </Style>
    </StackPanel.Resources>
    <Button Style="{StaticResource ButtonStyleA}" Content="Lorem Ipsum" />
    <Button Style="{StaticResource ButtonStyleB}" Content="Lorem Ipsum" />
</StackPanel>

В StyleB TextBrush переопределяется, что также вызывает изменение шаблона, так какссылается на этот ресурс.

...