Как запустить раскадровку в шаблоне данных в элементе управления содержимым в пользовательском элементе управления из кода программной части?

ПУХ.

Я серьезно. Я объясню это следующим образом...

Раскадровка имеет ключ "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 из кода программной части, чтобы запустить анимацию?


person Jippers    schedule 09.01.2009    source источник
comment
Хаха спасибо. Я знаю, что это беспорядок, но это истинное резюме этого.   -  person Jippers    schedule 09.01.2009


Ответы (1)


АХ ХА!

Поэтому я нашел обходной путь к решению этой проблемы. Мое третье обновление, в котором я развлекался мыслью просто запустить событие, казалось более плодотворным. Все можно найти здесь.

http://www.codeproject.com/script/Forums/View.aspx?fid=1004114&msg=2827455

Короче говоря, я использовал FindResource для получения DataTemplate, а затем FindName кнопки в DataTemplate, обычно используемой для запуска анимации. Затем я поднял кнопку, нажав на эту кнопку.

person Jippers    schedule 09.01.2009