2011-09-07 5 views
3

ImageFader라는 사용자 지정 컨트롤을 만들고 있습니다. 스타일 템플릿은 다음과 같습니다문제 후킹 제어 템플릿 리소스의 스토리 보드 이벤트가 완료되었습니다.

private void FadeImageStoryboard_Completed(object sender, EventArgs e) 
{ 
    SourceImage.Source = TargetImage.Source; 
    SourceImage.Opacity = 1; 
    TargetImage.Opacity = 0; 
} 
: 완성 된 핸들러에서

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    SourceImage = Template.FindName("PART_SourceImage", this) as Image; 
    TargetImage = Template.FindName("PART_TargetImage", this) as Image; 
    FadeImageStoryboard = Template.Resources["FadeImageStoryboard"] as Storyboard; 

    FadeImageStoryboard.Completed += new EventHandler(FadeImageStoryboard_Completed); 
} 

나는 이미지를 교체하고 투명도를 재설정하기 위해 노력하고있어 :

코드에서
<ControlTemplate TargetType="{x:Type controls:ImageFader}"> 
    <Grid> 
     <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
       Stretch="{TemplateBinding Stretch}" 
       x:Name="PART_SourceImage" Opacity="1" /> 

     <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
       Stretch="{TemplateBinding Stretch}" 
       x:Name="PART_TargetImage" Opacity="0" /> 

    </Grid> 
    <ControlTemplate.Resources> 
     <Storyboard x:Key="FadeImageStoryboard"> 
      <!-- fade in the new image --> 
      <DoubleAnimation From="0" To="1" 
           Duration="{TemplateBinding FadeTime}" 
           Storyboard.TargetName="PART_TargetImage" 
           Storyboard.TargetProperty="Opacity" /> 

      <!-- fade out the previous image --> 
      <DoubleAnimation From="1" To="0" 
           Duration="{TemplateBinding FadeTime}" 
           Storyboard.TargetName="PART_SourceImage" 
           Storyboard.TargetProperty="Opacity" /> 

     </Storyboard> 
    </ControlTemplate.Resources> 
</ControlTemplate> 

, 나는이 있습니다

FadeImageStoryboard.Begin(this, this.Template, true); 
01 :

는 I 이것을 이용한 DispatchTimer 내부의 애니메이션을 시작

두 개 이상의 ImageFader 컨트롤을 동일한 윈도우에 배치해야만 모든 것이 잘 작동합니다. DispatchTimer를 사용하여 다른 간격으로 애니메이션을 시작하면 스토리 보드 완료 이벤트가 두 ImageFaders에서 실행됩니다.

저는 컨트롤이 정적 참조로 템플릿 리소스에서 스토리 보드를 가져오고 있다고 생각합니다.

어떻게해야합니까?

+0

코드 뒤에서 스토리 보드를 만들려고 시도 했습니까? 컨트롤의 모든 인스턴스가 동일한 리소스를 사용하고있는 것처럼 들립니다. – Tejs

+0

나는 그렇게하지 못했다. 그러나 가능하다면 나는 그것을 피하고 싶다. XAML을 좋아하고 코드에서 스토리 보드를 만드는 것은보기 흉한 것처럼 보입니다. – mbursill

답변

1

하나 개의 솔루션은 코드에서 스토리 보드를 만들 수 있습니다, 너무 추한 도착하지 않습니다 :)

그냥 이것에 대한 코드를 변경 :이 스토리 보드 자신의 얻을 것이다

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    SourceImage = Template.FindName("PART_SourceImage", this) as Image; 
    TargetImage = Template.FindName("PART_TargetImage", this) as Image; 
    FadeImageStoryboard = GetFadeImageStoryboard(); 

    FadeImageStoryboard.Completed += new EventHandler(FadeImageStoryboard_Completed); 
} 

private Storyboard GetFadeImageStoryboard() 
{ 
    DoubleAnimation fadeNewImage = new DoubleAnimation { From = 0, To = 1, Duration = FadeTime }; 
    Storyboard.SetTarget(fadeNewImage, SourceImage); 
    Storyboard.SetTargetProperty(fadeNewImage, new PropertyPath("Opacity")); 

    DoubleAnimation fadePreviousImage = new DoubleAnimation { From = 0, To = 1, Duration = FadeTime }; 
    Storyboard.SetTarget(fadePreviousImage, TargetImage); 
    Storyboard.SetTargetProperty(fadePreviousImage, new PropertyPath("Opacity")); 

    Storyboard fadeImageStoryboard = new Storyboard(); 
    fadeImageStoryboard.Children.Add(fadeNewImage); 
    fadeImageStoryboard.Children.Add(fadePreviousImage); 

    return fadeImageStoryboard; 
} 

그리고 모든 제어 . 나는이 스토리 보드를 템플릿의 일부로 만드는 것이 좋은 생각이라고 생각하지 않습니다.이 컨트롤의 올바른 동작에 중요한 역할을하며, 거의 모든 것을 변경할 수는 없습니다 (거의 모든 경우에서 그렇습니다). 코드를 반복해야하는 템플릿).

관련 문제