Button
再定義されたテンプレートと、マウスのイン、アウト、アップ、ダウン、および無効と有効の状態間の遷移用のアニメーションを使用して、共通のスタイルを作成したいと考えています。それは問題ではありませんが、背景色を除いて基本的に同じボタン スタイルをもう 1 つ作成したいと考えています。
スタイル リソースとストーリーボードで、 Normal、Hover、およびDisabled状態の色を定義しました。
<Style.Resources>
<Color x:Key="DisabledBackground">#4c4c4c</Color>
<Color x:Key="NormalBackground">#538ce1</Color>
<Color x:Key="HoverBackground">#6ea8ff</Color>
<Storyboard x:Key="MouseOverAnimation">
<ColorAnimation Storyboard.TargetName="BackgroundBrush"
Storyboard.TargetProperty="Color"
To="{StaticResource HoverBackground}"
Duration="0:0:0.3" />
<DoubleAnimation Storyboard.TargetName="Underlay"
Storyboard.TargetProperty="Opacity"
To="0.7"
Duration="0:0:0.3" />
</Storyboard>
<!-- and few others... -->
</Style>
次に、テンプレートをカスタマイズし、最後にControlTemplate.Triggers
セクションをカスタマイズしました。
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{DynamicResource MouseOverAnimation}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{DynamicResource MouseOutAnimation}"/>
</Trigger.ExitActions>
</Trigger>
<!-- and few others... -->
今私が欲しいのは、新しいスタイルを作成し、次のように色を変更することDisabledBackground
ですNormalBackground
:
<Style x:Key="Start"
TargetType="{x:Type Button}"
BasedOn="{StaticResource {x:Type Button}}">
<Style.Resources>
<Color x:Key="DisabledBackground">#4c4c4c</Color>
<Color x:Key="NormalBackground">#960a0a</Color>
<Color x:Key="HoverBackground">#de1111</Color>
</Style.Resources>
</Style>
コントロール テンプレートはそのままにしておきます。DynamicResource
ストーリーボードはバインドまたは動的リソースを持つことができないため、例外で終わるスタイル リソースでストーリーボードを参照するために、共通のボタン スタイルを使用したことにおそらくお気付きでしょう。これは私の最後の「解決策」ですが、うまくいきませんでしたが、他に何も思いつきませんでした。
2 つの色を変更するためだけにボタン スタイル全体をコピー アンド ペーストしたくありません。ストーリーボード アニメーションで使用される色を「動的に」変更したり、少なくともスタイルを継承してそこに色を設定したりするには、どうすればスタイルを変更できますか?
完全な XAML
<Style TargetType="{x:Type Button}">
<Style.Resources>
<Color x:Key="DisabledBackground">#4c4c4c</Color>
<Color x:Key="NormalBackground">#538ce1</Color>
<Color x:Key="HoverBackground">#6ea8ff</Color>
<Storyboard x:Key="MouseOverAnimation">
<ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="{StaticResource HoverBackground}" Duration="0:0:0.3" />
<DoubleAnimation Storyboard.TargetName="Underlay" Storyboard.TargetProperty="Opacity" To="0.7" Duration="0:0:0.3" />
</Storyboard>
<Storyboard x:Key="MouseOutAnimation" FillBehavior="Stop">
<ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="{StaticResource NormalBackground}" Duration="0:0:0.3" />
<DoubleAnimation Storyboard.TargetName="Underlay" Storyboard.TargetProperty="Opacity" To="0.2" Duration="0:0:0.3" />
</Storyboard>
<Storyboard x:Key="MouseDownAnimation">
<DoubleAnimation Storyboard.TargetName="OverlayGradient" Storyboard.TargetProperty="Opacity" To="0.45" Duration="0:0:0.1" />
</Storyboard>
<Storyboard x:Key="MouseUpAnimation" Storyboard.TargetProperty="Background" FillBehavior="Stop">
<DoubleAnimation Storyboard.TargetName="OverlayGradient" Storyboard.TargetProperty="Opacity" To="0.5" Duration="0:0:0.1" />
</Storyboard>
<Storyboard x:Key="DisabledAnimation">
<ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="{StaticResource DisabledBackground}" Duration="0:0:0.3" />
<ColorAnimation Storyboard.TargetName="UnderlayFillBrush" Storyboard.TargetProperty="Color" To="{StaticResource DisabledBackground}" Duration="0:0:0.3" />
</Storyboard>
<Storyboard x:Key="EnabledAnimation">
<ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="{StaticResource NormalBackground}" Duration="0:0:0.3" />
<ColorAnimation Storyboard.TargetName="UnderlayFillBrush" Storyboard.TargetProperty="Color" To="{StaticResource NormalBackground}" Duration="0:0:0.3" />
</Storyboard>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<!-- Button underlay glow
-->
<Rectangle x:Name="Underlay" Opacity="0.2">
<Rectangle.Fill>
<SolidColorBrush x:Name="UnderlayFillBrush" Color="{DynamicResource NormalBackground}"/>
</Rectangle.Fill>
<Rectangle.Effect>
<BlurEffect Radius="35" KernelType="Gaussian"/>
</Rectangle.Effect>
</Rectangle>
<!-- Button base border with rounded corners
Contains base background
-->
<Border x:Name="ButtonBackground" BorderThickness="1" CornerRadius="2">
<Border.BorderBrush>
<SolidColorBrush Color="Black" Opacity="0.8"/>
</Border.BorderBrush>
<Border.Background>
<SolidColorBrush x:Name="BackgroundBrush" Color="{DynamicResource NormalBackground}"/>
</Border.Background>
<!-- Button Overlay
Adds the background overlay gradient -->
<Border CornerRadius="2">
<Border.Background>
<LinearGradientBrush x:Name="OverlayGradient" Opacity="0.5" StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="0.02" Color="White"/>
<GradientStop Offset="0.02" Color="Transparent"/>
<GradientStop Offset="0.85" Color="#000000" />
</LinearGradientBrush>
</Border.Background>
<Border BorderThickness="1" CornerRadius="2">
<Border.BorderBrush>
<SolidColorBrush Color="#b4b4b4" Opacity="0.2"/>
</Border.BorderBrush>
<!-- Inner text -->
<TextBlock Text="{TemplateBinding Content}"
FontSize="{TemplateBinding FontSize}"
FontFamily="Segoe UI"
Foreground="White"
TextWrapping="Wrap"
HorizontalAlignment="Center"
VerticalAlignment="Center"
TextOptions.TextFormattingMode="Display"
RenderOptions.BitmapScalingMode="NearestNeighbor">
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="0" BlurRadius="6" Color="Black" RenderingBias="Quality"/>
</TextBlock.Effect>
</TextBlock>
</Border>
</Border>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{DynamicResource DisabledAnimation}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{DynamicResource EnabledAnimation}"/>
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{DynamicResource MouseOverAnimation}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{DynamicResource MouseOutAnimation}"/>
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{DynamicResource MouseDownAnimation}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{DynamicResource MouseUpAnimation}"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>