Как запустить раскадровку в шаблоне данных в элементе управления контентом в пользовательском элементе управления из кода? - PullRequest
3 голосов
/ 09 января 2009

Уф.

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

В раскадровке есть ключ "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 из кода для запуска анимации?

1 Ответ

1 голос
/ 09 января 2009

АХ ХАХ!

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...