Уф.
Я серьезно. Я изложу это следующим образом ...
В раскадровке есть ключ "myStoryboard". Он хранится в DataTemplate с ключом «myDataTemplate».
Этот шаблон данных используется в ContentControl с именем «myContentControl» этим тегом:
<ContentControl Name="myContentControl"
ContentTemplate="{DynamicResource myDataTemplate}"/>
Контроль содержания используется в моем UserControl. В коде UserControl я сделал жест клавиатуры, который должен был запустить «myStoryBoard», но у меня нет такой удачи, чтобы добраться до него.
private void StartSB(object sender, ExecutedRoutedEventArgs e)
{
Storyboard sb = (Storyboard) this.TryFindResource("myStoryboard");
sb.Begin(this);
}
sb всегда равен нулю. Как я могу получить раскадровку?
UPDATE:
так что играя с TryFindResource () мне удалось добраться до myDataTemplate
private void StartSB(object sender, ExecutedRoutedEventArgs e)
{
object sb = this.myContentControl.TryFindResource("myDataTemplate");
}
в средстве просмотра Locals я вижу sb is myDataTemplate. Я могу видеть в дереве sb.base.Resources.Keys, которое представляет собой массив ресурсов, в котором находится «myStoryboard». Ох, так близко!
UPDATE2:
Более полный код здесь. Теперь я понимаю, что это может быть слишком спагетизированным, чтобы объяснить словами.
<UserControl >
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources\myUCResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<ContentControl Name="myContentControl"
ContentTemplate="{DynamicResource myDataTemplate}"
Content="{Binding}" />
...
</UserControl>
теперь код для этого пользовательского элемента управления
namespace myclass
{
public partial class myUserControl: UserControl, System.ComponentModel.INotifyPropertyChanged
{
...
public myUserControl()
{
InitializeComponent();
<!--setup keybinding-->
}
public void KeyBindExecuted(object sender, ExecutedRoutedEventArgs e)
{
Object sb = this.myContentControl.TryFindResource("myDataTemplate");
//sb returns the DataTemplate
}
}
}
И, наконец, словарь ресурсов, содержащий пользовательский интерфейс и анимацию, которую я в конечном итоге хочу запустить. (MyUCResources.xaml)
<ResourceDictionary>
<DataTemplate x:Key="myDataTemplate" >
<Grid>
<!-- elements like buttons -->
</Grid>
<DataTemplate.Resources>
<Storyboard x:Key="myStoryBoard">
<DoubleAnimation>
<!-- animation stuff-->
</DoubleAnimation>
</Storyboard>
</DataTemplate.Resources>
<DataTemplate.Triggers>
<EventTrigger SourceName="aButton" RoutedEvent="Button.Click">
<BeginStoryboard Storyboard="{StaticResource myStoryBoard}" />
</EventTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ResourceDictionary>
Обновление 3:
ок, другой подход. Могу ли я использовать EventTrigger в DataTemplate из кода для запуска анимации?