2013-09-13 3 views
2

У меня есть словарь ресурсов со стилем для моего окна. В этом стиле я определяю шаблон и в нем я определяю много вещей. Среди других я определяю раскадровку для анимации определенных вещей, которые определены в шаблоне. Это выглядит примерно так:Не удается найти ресурс, определенный в ControlTemplate

<Style TargetType="local:MyWindow"> 
    <Setter Property="Background" Value="red" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:MyWindow"> 
       <Grid> 
        <Grid.Resources> 
         <Storyboard x:Key="MyAnimation"> 
          <DoubleAnimation Storyboard.TargetName="ToBeAnimated" ... /> 
         </Storyboard> 
        </Grid.Resources> 
        <Grid x:Name="ToBeAnimated" Background="Green"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Теперь у меня есть экземпляр MyWindow (который определенно в своей работе применяет стиль :)) и из окна я хочу, чтобы запустить анимацию. Однако это

this.FindResource("MyAnimation"); 

не удалось!

Если я двигаю раскадровку в

<ControlTemplate.Resources/> 

можно найти, но если я делать

((Storyboard)FindResource("StoryboardOpenOverlay")).Begin(); 

я получаю другую ошибку, что не может найти ToBeAnimated ...

Любые идеи?

ответ

3

Вы можете добавить имя на сетке и использовать шаблонную часть в получите ссылку на это:
-Добавить [TemplatePart(Name = "gridName",DataGrid.headerName, Type = typeof(Grid))] на вас Класс MyWindow
-Инверсия OnApplyTemplate:

protected override void OnApplyTemplate() 
    { 
     Grid grid = this.GetTemplateChild("gridName") as Grid; 
     if (grid != null) 
     { 
      Storyboard storyboard = grid.Resources["MyAnimation"] as Storyboard ; 

     } 
     base.OnApplyTemplate(); 
    } 
+0

Удивительный! Благодарю. На самом деле я могу вызвать this.GetTemplateChild (...), когда захочу, не только в OnApplyTemplate(). Благодаря! –

+0

Я предпочитаю делать это в ApplyTemplate и сохранять значение в локальном поле, например, вы каждый раз сохраняете стоимость вызова GetTemplateChild –

1

Хотя раскадровка помещаются в вашем Grid, попробуйте следующее:

((Grid)this.Content).FindResource("MyAnimation"); 

или, если это возможно,

this.ToBeAnimated.FindResource("MyAnimation"); 
+0

не думаю, что работа, this.Content будет все, что в ContentTemplate не ControlTemplate, и вы не можете использовать this.ToBeAnimated, поскольку он определен в стиле –

+0

this.Content является сетка и потому, что раскадровка находится там, он должен работать. –

+0

Нет this.Content может быть сеткой, но не сеткой внутри ControlTemplate, это будет то, что находится внутри ContentTemplate. (Если он определен, содержимое отображается внутри ContentPresenter не непосредственно на уровне ControlTemplate) –

Смежные вопросы