ПУХ.
Я серьезно. Я объясню это следующим образом...
Раскадровка имеет ключ "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 здесь всегда нулевой. Как я могу получить раскадровку?
ОБНОВИТЬ:
поэтому, играя с TryFindResource(), мне удалось добраться до myDataTemplate
private void StartSB(object sender, ExecutedRoutedEventArgs e)
{
object sb = this.myContentControl.TryFindResource("myDataTemplate");
}
в средстве просмотра Locals я вижу, что sb - это myDataTemplate. Я вижу в дереве sb.base.Resources.Keys, который представляет собой массив ресурсов, внутри которого находится «myStoryboard». О, так близко!
ОБНОВЛЕНИЕ2:
Больше кода здесь. Теперь я понимаю, что это может быть слишком спагетти, чтобы объяснить словами.
<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 из кода программной части, чтобы запустить анимацию?