WPF: грязное мигание повторно используемого всплывающего окна при отображении анимации - PullRequest
0 голосов
/ 28 августа 2011

Я делаю WPF-modeless-reusable окно с отображением анимации. Он был повторно использован для загрузки производительности. И тогда возникла новая проблема.

Сначала это код 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 Ответ

1 голос
/ 28 августа 2011

Я предполагаю, что ваша проблема на самом деле в том, что у вас нет анимации, которая затухает в указанном окне, поэтому при нажатии кнопки 1 выполняется анимация,

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

Независимо от состоянияон находится в диапазоне от 0 до 1, вы видите «мерцание», которое устанавливает его в 0, прежде чем анимация может быть применена, если она уже равна 1.

Чтобы избавиться от нее, выполните обратную анимациюкогда окно закрыто (непрозрачность от 1 до 0 при нажатии кнопки 2, я верю).

PS: Hide () аналогична настройке win.Visibility = Visibility.Hidden;, которую вы не приняли во внимание Visibility.Collapsed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...