次の XAML を使用してベクター イメージ ボタンを作成し、マウス ホバー時にアニメーションで不透明度を変更します。ボタンのスタイルは次のとおりです。
<Style x:Key="IconButtonStyle" TargetType="Button">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="IsTabStop" Value="True" />
<Setter Property="Focusable" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ContentPresenter">
<EasingDoubleKeyFrame KeyTime="0" Value="1.0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ContentPresenter">
<EasingDoubleKeyFrame KeyTime="0" Value="0.6"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter x:Name="ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="{TemplateBinding Padding}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
以下はその使用例です:-
<Button Width="40" Height="40" Style="{StaticResource IconButtonStyle}">
<Path Width="30" Height="30" Style="{StaticResource MetroButtonRightStyle}" Fill="Red" />
</Button>
のPath
スタイルは次のようになります。
<Style x:Key="MetroButtonRightStyle" TargetType="{x:Type Path}">
<Setter Property="Stretch" Value="Fill" />
<Setter Property="Data" Value="{StaticResource MetroButtonRightGeometry}" />
</Style>
MetroButtonRightGeometry
( Data プロパティで指定されたリソースは<Geometry>
、サイズのためにここには含めていません)。
ストーリーボードを変更して、不透明度ではなく画像の色を変更したいのですが、ストーリーボード内からPath
のFill
プロパティにアクセスできないようです。または、現在の形式でも可能かどうか. 助言がありますか?
アップデート
視覚状態のストーリーボードをColorAnimationUsingKeyFrames
そのように変更することで解決策を見つけました (TargetProperty に注意してください!):-
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Button.Content).(Path.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="ContentPresenter">
<EasingColorKeyFrame KeyTime="0" Value="Gold" />
</ColorAnimationUsingKeyFrames>
そして、このように私のパスにa を含めFill
ます:-
<Path Width="30" Height="30" Style="{StaticResource MetroButtonRightStyle}" Fill="{StaticResource SomeSolidBrush}" />
ただし、基本的に無視される Fill を含めなければならないのは少しハックな気がしますが、ストーリーボードの TargetProperty に「フック」を提供するためだけです。これがないと、「'Fill' プロパティがパス '{0}.{1}.{2}' の DependencyObject を指していません」というエラーが表示されます。