Я создал очень простое тестовое приложение, чтобы попытаться решить эту проблему, описанную мне коллегой. Он смог запустить его в C #, но я считаю, что ему нужно было решение более универсальным, и он хотел, чтобы это делалось строго в XAML. Проблема заключалась в следующем: как вы запускаете раскадровку внутри UserControl в ответ на событие в элементе управления в содержащем окне (родительский элемент не обязательно должен быть окном, это может быть страница или другой пользовательский элемент управления .. Я использую окно для простоты). Итак, мой лучший пример - у вас есть окно с кнопкой и экземпляр вашего UserControl. Вы хотите, чтобы событие Click для кнопки запускало раскадровку внутри UserControl.
Внутри самого UserControl Storyboard объявляется как ресурс с ключом MyStoryboard. Я создал кнопку с EventTrigger, чтобы показать, что я могу вызвать раскадровку, ссылаясь на нее с помощью выражения Binding. Вот полный XAML для моего UserControl:
<UserControl x:Class="UserControlStoryboard.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<UserControl.Resources>
<Storyboard x:Key="MyStoryboard">
<ColorAnimation Storyboard.TargetName="grid" Storyboard.TargetProperty="(Grid.Background).Color" From="CadetBlue" To="White" Duration="0:0:2" />
</Storyboard>
</UserControl.Resources>
<Grid Background="CadetBlue" x:Name="grid">
<Button Content="Press Me" Height="50">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<BeginStoryboard.Storyboard>
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" Path="Resources[MyStoryboard]" />
</BeginStoryboard.Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</Grid>
Я надеялся, что, поскольку я смог сказать Storyboard начать с ссылки на него с помощью выражения Binding, я смогу сделать то же самое из Window, который содержит этот UserControl в качестве дочернего элемента. Но я не могу понять, как получить ссылку на раскадровку внутри родительского окна. Разве это невозможно сделать только в XAML?
В родительском окне моего тестового проекта нет ничего, кроме кнопки и экземпляра этого UserControl. Если это вообще возможно, какой элемент позволил бы мне добавить EventTrigger, где источником события является Button, а действие триггера сообщает Storyboard UserControl о начале?
Спасибо.