2011-08-28 99 views
0

我製作了一個Wpf-modeless-可重用窗口並顯示動畫。它被重新用於加載性能。然後出現了一個新問題。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(); } 
} 

這裏是一個彈出式窗口的XAML ...

<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> 

...終於,這裏是彈出窗口的後面的代碼。

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" 

不管是什麼狀態時,它如果它已經在1,它會從0變爲1,你會看到一個「閃爍」,在動畫可以應用之前將其設置爲0.

要擺脫它,請在窗口已關閉(我相信按鈕2上的不透明度從1到0)。

PS:Hide()與設置爲win.Visibility = Visibility.Hidden;的設置相同,但您沒有考慮到Visibility.Collapsed。

+0

1)我該如何玩逆轉aniShow? 2)我已經添加下面的代碼來擺脫眨眼:aniShowing.Remove(this); this.Opacity = 0;但它不起作用。 – mjk6026

+0

訂閱Closing事件,並使其運行故事板,將Opacity從1設置爲0. –

+0

不! win1不能提高隱藏的關閉事件。因爲它使用Hide()方法而不是Close()來重用。這是我訂閱IsVisibleChanged事件的原因。 – mjk6026