2010-04-29 4 views
4

내 ViewModel의 속성 변경을 기반으로 간단한 (생각합니다) 애니메이션 효과를 만들려고합니다. 대상이 Window에서 상속받은 사용자 지정 컨트롤의 컨트롤 템플릿에서 특정 텍스트 블록이되도록하고 싶습니다.WPF : 애니메이션 대상 선택

내가 본 적이있는 기사 예제에서 DataTrigger가이를 수행하는 가장 쉬운 방법입니다. Window.Triggers는 DataTriggers를 지원하지 않으므로 스타일에서 트리거를 적용하려고했습니다. 현재 문제는 TextBlock (또는 다른 자식 컨트롤)을 대상으로 할 수 없다는 것입니다. 애니메이션이 전체 창 배경에 적용된다는 것은 어떻게됩니까?

StoryBoard.Target을 완전히 벗어나면 효과가 완전히 동일합니다.

잘못된 구문을 사용하는 것이 올바른 방법입니까, 아니면이를 수행하는 더 쉬운 방법이 있습니까?

<Style x:Key="MyWindowStyle" TargetType="{x:Type Window}"> 
    <Setter Property="Template" Value="{StaticResource MyWindowTemplate}"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ChangeOccurred}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard BeginTime="00:00:00" Duration="0:0:2" Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=TextBlock}}" 
            Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"> 
         <ColorAnimation FillBehavior="Stop" From="Black" To="Red" Duration="0:0:0.5" AutoReverse="True"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

업데이트

또한 내가 TextBlock의 이름을 지정하고 (Timores가 제안) StoryBoard.TargetName를 통해 그것을 참조하기 위해 시도하고, 오류가 "에서 targetName 속성이 설정 될 수있어 언급이 있으시면 스타일 세터. "

+0

원하는 애니메이션 타겟이 정확히 무엇입니까? 당신은 * "사용자 정의 컨트롤의 컨트롤 템플릿에있는 특정 텍스트 블록"*을 말한 다음 사용자 정의 컨트롤이 아닌'Window' 스타일을 만듭니다. 애니메이션 타겟이 포함 된 코드를 제공 할 수 있습니까? Window가 TextBlock 타입의 조상을 가질 것으로 기대하지 않기 때문에 위의 대상 바인딩이 작동하지 않아야합니다. 이것이 가능합니까? – gehho

+0

죄송합니다. 설명하기가 어렵습니다. 커스텀 컨트롤은 윈도우에서 파생 된 윈도우입니다. 셋업/스타일은 다른 사람이 만들었으므로이 애니메이션을 개조하려고합니다. Textblock은 자식 컨트롤입니다. 다시 보았을 때, RelativeSource/AncestorType은 부모가 아닌 자식을 대상으로하려고하기 때문에 아마도 가까이 있지 않습니다. –

답변

4

편집을 참조하십시오 나는 TextBlock 사용자 정의 창/제어의 ControlTemplate에 있다는 사실을 감독했다. 나는 안에ControlTemplate 내에서 Storyboard외부의ControlTemplate 인 것을 목표로하는 것이 가능하다고 생각하지 않는다. 그러나 사용자 정의 창에 속성을 정의한 다음 ChangeOccurred 속성에 데이터 바인딩 한 다음 ControlTemplate에 트리거를 추가합니다.이 트리거는 이제 Window의 ViewModel 속성이 아닌 사용자 정의 컨트롤의 속성에 의해 트리거됩니다 (당연히 간접적으로 ChangeOccurred이 애니메이션을 트리거하는 사용자 정의 윈도우의 속성에 바인딩되어 있기 때문에 ViewModel에 의해 트리거됩니다. 복잡한 문장이므로 이해하시기 바랍니다. 이 옵션이 있습니까? 따를 수 있니? ;-)

아마 몇 가지 코드 도움 :

public class MyCustomWindow : Window 
{ 
    public static readonly DependencyProperty ChangeOccurred2 = DependencyProperty.Register(...); 

    public bool ChangeOccurred2 { ... } 

    // ... 
} 

그리고 어떤 XAML을 :

<local:MyCustomWindow ChangeOccurred2="{Binding ChangeOccurred}" ... > 
    <!-- Your content here... --> 
</local:MyCustomWindow> 

<!-- Somewhere else (whereever your ControlTemplate is defined) --> 
<ControlTemplate TargetType="{x:Type local:MyCustomWindow}"> 

    <!-- your template here --> 

    <ControlTemplate.Triggers> 
     <Trigger Property="ChangeOccurred2" Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard BeginTime="00:00:00" Duration="0:0:2" 
           Storyboard.TargetName="txtWhatever" 
           Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"> 
         <ColorAnimation FillBehavior="Stop" 
             From="Black" To="Red" 
             Duration="0:0:0.5" 
             AutoReverse="True"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

참고 : 나는 뷰 모델의의 구별로 그것을 원했기 때문에 나는 윈도우의 재산 ChangeOccurred2 이름 ChangeOccurred 속성 물론이 속성에 대해 더 나은 이름을 선택해야합니다. 그러나, 나는 그러한 결정에 대한 배경을 놓치고있다.


내 오랜 답변 :

그래서, 당신은 (사용자 정의) 창의 내용에있는 TextBlock 애니메이션을 할?!

왜 Window에 스타일을 설정하고 TextBlock 자체에 스타일을 설정하지 않으시겠습니까? 어쩌면 당신은 같은 것을 시도해야한다 (이 테스트하지 않았을!) :

<local:MyCustomWindow ... > 
    <!-- ... --> 
    <TextBlock x:Name="textBlockAnimated" ... > 
     <TextBlock.Style> 
      <Style TargetType="{x:Type TextBlock}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ChangeOccurred}" Value="True"> 
         <DataTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard BeginTime="00:00:00" Duration="0:0:2" 
              Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"> 
            <ColorAnimation FillBehavior="Stop" 
                From="Black" To="Red" 
                Duration="0:0:0.5" 
                AutoReverse="True"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </DataTrigger.EnterActions> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
    <!-- ... --> 
</local:MyCustomWindow> 

{Binding ChangeOccurred} 충분하지 않을 수 있습니다. TextBlockDataContext을 추가하거나 RelativeSource 등을 추가해야 할 수 있습니다.

+0

업데이트 된 답변이 작동합니다! 당신의 도움을 주셔서 감사합니다. 내가 접근하는 방식이 거꾸로 된 것처럼 느껴졌지만, WPF에서 스타일링/애니메이션 작업을하는 데있어 매우 익숙합니다. –

0

MyWindowTemplate에 TextBlock이 있습니까?

그렇다면 TextBlock에 이름을 지정하고 Storyboard.TargetName을 사용하여 이름을 참조하십시오.

another question in SO

+0

죄송합니다, 나는 그것을 시도하고 있다고 언급 했어야합니다 : "TargetName 속성은 스타일 설정자에서 설정할 수 없습니다." –

+0

또한 : 예, 컨트롤 템플릿에 있습니다. –