#wpf #xaml #wpf-controls #wpf-animation
#wpf #xaml #wpf-элементы управления #wpf-анимация
Вопрос:
Итак, я упростил это только ради примера. У меня есть кнопка, и в ее ControlTemplate у меня есть красный эллипс. При нажатии кнопки (событие наведения курсора мыши) Я хочу, чтобы анимируемый эллипс стал прозрачным через 1 секунду. Вот мой xaml
<Button>
<Button.Template>
<ControlTemplate>
<Grid Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
ClipToBounds="True">
<Ellipse x:Name="ripple"
Height="20" Width="20"
Fill="Red"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="1"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Button.Template>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.MouseDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ripple"
Storyboard.TargetProperty="Opacity"
From="1" To="0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Проблема в том, что когда я нажимаю на кнопку, эллипс не становится прозрачным. Я предполагаю, что по какой-то причине он не может найти объект с именем «ripple», но я не знаю почему. Что я делаю не так?
Ответ №1:
Переместите EventTrigger
в ControlTemplate.Triggers
и используйте PreviewMouseDown
событие, потому что Button
обрабатывает MouseDown
событие
<Button>
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
ClipToBounds="True">
<Ellipse
x:Name="ripple"
Height="20"
Width="20"
Fill="Red"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="1"/>
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="PreviewMouseDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="ripple"
Storyboard.TargetProperty="Opacity"
From="1"
To="0"
Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>