2

私はStyleXAML で次のベースを持っています。それに基づいて、新しいスタイルごとに異なるプロパティが 1 つだけあるいくつかの新しいスタイルを作成する必要があります。

<UserControl.Resources>
<Style x:Key="BaseButtonStyle" TargetType="{x:Type ButtonBase}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Background" Value="{StaticResource Button.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource Button.BorderBrush}"/>
            <Setter Property="Foreground" Value="{StaticResource Button.Foreground}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Padding" Value="10,1,10,1"/>
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ButtonBase}">
                        <Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                            <Grid x:Name="FocusState" Opacity="0">
                                <Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/>
                            </Grid>
                            <Grid x:Name="DefaultState">
                                <Border Background="{StaticResource Button.DefaultState.Border1}"
                                    Padding="1" CornerRadius="3">
                                    <Border Background="{StaticResource Button.DefaultState.Border2}"
                                        Padding="1" CornerRadius="2">
                                    </Border>
                                </Border>
                            </Grid>
                            <Grid x:Name="HoverState" Opacity="0">
                                <Border Background="{StaticResource Button.HoverState.Border1}"
                                    Padding="1" CornerRadius="3">
                                    <Grid>
                                        <Border Background="{StaticResource Button.HoverState.Border2}"
                                            Padding="1" CornerRadius="2">
                                            <Border Background="{StaticResource Button.HoverState.Border3}"
                                                CornerRadius="1"/>
                                        </Border>
                                        <Border>
                                            <Border.Background>
                                                <RadialGradientBrush>
                                                    <RadialGradientBrush.RelativeTransform>
                                                        <TranslateTransform X="0" Y="0.5"/>
                                                    </RadialGradientBrush.RelativeTransform>
                                                    <GradientStop Color="#00FFFFFF" Offset="1"/>
                                                    <GradientStop Color="#BFFFFFFF" Offset="0"/>
                                                </RadialGradientBrush>
                                            </Border.Background>
                                        </Border>
                                    </Grid>
                                </Border>
                            </Grid>
                            <Grid x:Name="PressedState" Opacity="0">
                                <Border Background="{StaticResource Button.PressedState.Border1}"
                                    Padding="1" CornerRadius="3">
                                    <Border Background="{StaticResource Button.PressedState.Border2}"
                                        Padding="1" CornerRadius="2">
                                        <Border Background="{StaticResource Button.PressedState.Border3}"
                                            CornerRadius="1"/>
                                    </Border>
                                </Border>
                            </Grid>
                            <Grid x:Name="CheckedState" Opacity="0">
                                <Border Background="{StaticResource Button.CheckedState.Border1}"
                                    Padding="1" CornerRadius="3">
                                    <Border Background="{StaticResource Button.CheckedState.Border2}"
                                        Padding="1" CornerRadius="2">
                                        <Border Background="{StaticResource Button.CheckedState.Border3}"
                                            CornerRadius="1"/>
                                    </Border>
                                </Border>
                            </Grid>
                            <Grid Margin="2">
                                <ContentPresenter Margin="{TemplateBinding Padding}"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              RecognizesAccessKey="True"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Grid>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
                                <Setter TargetName="HoverState" Property="Opacity" Value="1"/>
                                <Setter TargetName="PressedState" Property="Opacity" Value="0"/>
                                <Setter TargetName="CheckedState" Property="Opacity" Value="0"/>
                                <Setter Property="Foreground"
                                    Value="{StaticResource Button.Foreground}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
                                <Setter TargetName="HoverState" Property="Opacity" Value="0"/>
                                <Setter TargetName="PressedState" Property="Opacity" Value="1"/>
                                <Setter TargetName="CheckedState" Property="Opacity" Value="0"/>
                                <Setter Property="Foreground"
                                    Value="{StaticResource Button.Foreground}"/>
                            </Trigger>
                            <Trigger Property="ToggleButton.IsChecked" Value="True">
                                <Setter TargetName="DefaultState" Property="Opacity" Value="0"/>
                                <Setter TargetName="HoverState" Property="Opacity" Value="0"/>
                                <Setter TargetName="PressedState" Property="Opacity" Value="0"/>
                                <Setter TargetName="CheckedState" Property="Opacity" Value="1"/>
                                <Setter Property="Foreground"
                                    Value="{StaticResource Button.Foreground}"/>
                            </Trigger>
                            <Trigger Property="IsFocused" Value="True">
                                <Setter TargetName="FocusState" Property="Opacity" Value="1"/>
                            </Trigger>
                            <Trigger Property="Button.IsDefaulted" Value="True">
                                <Setter TargetName="FocusState" Property="Opacity" Value="1"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="Root" Property="Opacity" Value="0.35"/>
                                <Setter Property="Foreground"
                                    Value="{StaticResource Button.Foreground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
</Style>

<UserControl.Resources>

これをベースボタンスタイルとして設定します

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/>

ここまでは順調ですね。次に、唯一の部分が異なる 2 番目のスタイルが必要です。

<Border Background="{StaticResource Button.DefaultState.BorderNEWZ}"
//instead of
<Border Background="{StaticResource Button.DefaultState.Border2}"

だから私はNEWSTYLETESTを試しました...

    <Style x:Key="NEWSTYLETEST" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ButtonBase}">
                    <Grid x:Name="Root" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                        <Grid x:Name="FocusState" Opacity="0">
                            <Border CornerRadius="4" Style="{StaticResource FocusTemplate}"/>
                        </Grid>
                        <Grid x:Name="DefaultState">
                            <Border Background="{StaticResource Button.DefaultState.Border1}"
                                Padding="1" CornerRadius="3">
                                <Border Background="{StaticResource Button.DefaultState.BorderNEWZ}"
                                    Padding="1" CornerRadius="2">
                                </Border>
                            </Border>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

これにより、必要なコントロール パーツが からButton.DefaultState.Border2に変更されますが、基本スタイルButton.DefaultState.BorderNEWZの残りの部分に含まれる残りの値は省略されます。<Setter Property="Template">

<Setter Property="Template">毎回全体をコピーして、必要な行を変更することもできますが、それはやり過ぎのようです。Button.DefaultState.Border2コードの大部分を繰り返さずに他のすべてを同じに保ちながら、それぞれの新しいスタイルの変更のみを対象とする方法はありますか?

4

1 に答える 1

1

BasedOnはプロパティごとに機能するため、この場合、「Template」プロパティをオーバーライドするように指示しました。(オールオアナッシング)最終的にあなたが探している答えはここに概説されています:

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/abe21d46-8e32-4f33-bb8f-750bdc38cb14/

于 2012-09-10T02:55:39.407 に答える