2011-08-28 11 views
0

애니메이션을 보여주는 Wpf-modeless-reusable 창을 만듭니다. 그것은 성능 로딩을 위해 재사용되었습니다. 그리고 나서 새로운 문제가 발생했습니다.WPF : 재사용 된 팝업의 더러운 깜박임 애니메이션 표시 창

처음에는 MainWindow의 코드입니다. win1은 팝업 창의 인스턴스입니다. 여기

public partial class MainWindow : Window 
{ 

    Window1 win1 = new Window1(); 

    public MainWindow() { InitializeComponent(); } 

    private void button1_Click(object sender, RoutedEventArgs e) { win1.Owner = this; win1.Show(); } 
    private void button2_Click(object sender, RoutedEventArgs e) { win1.Hide(); } 
    private void Window_Closed(object sender, EventArgs e) { win1.Close(); } 
} 

그리고

은 ...

<Window x:Class="WpfApplication4.Window1" x:Name="win" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300" ShowActivated="False" Background="#00000000" AllowsTransparency="True" WindowStyle="None" IsVisibleChanged="Window_IsVisibleChanged"> 
    <Window.Resources> 
     <Storyboard x:Key="aniShowing" FillBehavior="Stop"> 
      <ParallelTimeline BeginTime="0:0:0" Duration="0:0:2"> 
       <DoubleAnimation Storyboard.TargetName="win" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2"/> 
      </ParallelTimeline> 
     </Storyboard> 

    </Window.Resources> 
    <Ellipse Fill="Red"/> 
</Window> 

팝업 윈도우의 XAML ... 그리고 마지막으로, 여기에 팝업 창 뒤에 코드입니다.

public partial class Window1 : Window 
{ 

    Storyboard aniShowing; 

    public Window1() 
    { 
     InitializeComponent(); 
     aniShowing = (Storyboard)this.Resources["aniShowing"]; 
    } 

    private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if ((bool)e.NewValue == true) { this.BeginStoryboard(aniShowing); } 
     else { aniShowing.Remove(this); this.Opacity = 0; } 
    } 
} 

나는 Window_IsVisibleChanged에서 애니메이션을 보여주고 싶습니다. 그것은 아주 잘 작동합니다. 그러나 그것은 처음입니다.

두 번째로 곧 win1이 깜박이며 애니메이션이 재생되었습니다.

세 번째로 네 번 째는 두 번째처럼 보입니다.

어떻게이 신비한 깜박임을 없앨 수 있습니까? 실제로 문제를 추측하고있어

답변

1

는 상기 창 밖을 페이드 애니메이션을하지 않아도, 그래서 button1을 클릭하면, 그것은 애니메이션,

Storyboard.TargetProperty="Opacity" From="0" To="1" 

을한다 무엇 이건 상태 그 0에서 1로 이동하면 이미 1 인 경우 애니메이션 적용 전에 0으로 설정하는 "깜박임"이 표시됩니다.

제거하려면 애니메이션 (내가 믿는 button2 클릭 1에서 0으로 불투명도) 닫힙니다.

추신 : 숨기기()는 win.Visibility = Visibility.Hidden;과 동일하지만 Visibility.Collapsed를 고려하지 않았습니다.

+0

1) 어떻게 반전 애니 쇼를 재생할 수 있습니까? 2) 이미 깜박임 제거를위한 다음 코드를 추가했습니다. aniShowing.Remove (this); this.Opacity = 0; 그러나 그것은 작동하지 않습니다. – mjk6026

+0

Closing 이벤트를 구독하고 불투명도를 1에서 0으로 설정하는 스토리 보드를 실행하게하십시오. –

+0

아니요! 숨을 닫을 이벤트를 제기하지 않습니다. 재사용을 위해 Close() 대신 Hide() 메서드를 사용하기 때문입니다. IsVisibleChanged 이벤트를 구독하는 이유입니다. – mjk6026