0

WPF/C# でアニメーション GIF を表示するには、Microsoft MSDN の次のコード サンプルを使用します: Show GIF animation in WPF

これをモードレス ウィンドウ ( window.Show()) で使用すると、画像がアニメーションしません。なんで?

(モーダルウィンドウ)ではwindow.ShowDialog()正しく動作します。

WPF Project Befor Start MainWindow で、モードレスで最初のタスクを実行してから閉じるためのウィンドウを表示します (これらは app.xaml.cs Startup イベントにあります)。

// app.xaml.cs 
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        FirstTask firstTask = new FirstTask();
        firstTask.Show();

        // do task
        System.Threading.Thread.Sleep(5000);

        firstTask.Close();

        MainWindow mainWindow = new MainWindow();

        mainWindow.ShowDialog();
    }
}

AnimatedGIFControl クラスの AnimatedGIFControl_Loaded 関数のコードの最後に、アニメーション gif を自動的に開始するコードを追加します。

ImageAnimator.Animate(_bitmap, OnFrameChanged);

完全な AnimatedGIFControl_Loaded コード

     void AnimatedGIFControl_Loaded(object sender, RoutedEventArgs e)
    {
        // Get GIF image from Resources
        if (gifanimate.Properties.Resources.ProgressIndicator != null)
        {
            _bitmap = gifanimate.Properties.Resources.ProgressIndicator;
            Width = _bitmap.Width;
            Height = _bitmap.Height;

            _bitmapSource = GetBitmapSource();
            Source = _bitmapSource;
            ImageAnimator.Animate(_bitmap, OnFrameChanged);
        }             
    }

ImageAnimator.Animate(_bitmap, OnFrameChanged);

また、アニメーションgifを表示するためにfirstTaskウィンドウとMainWindowに追加します。

別の問題: firstTask.Close(); の後。アプリケーションは MainWindow を表示しません。なぜ知っていましたか?

4

2 に答える 2

0

Show() メソッドは呼び出しをブロックせず、実行を続行します。

ShowDialog() メソッドは呼び出しをブロックし、モーダル ダイアログが閉じられるまで実行を待機します (また、その間、すべての UI メッセージがディスパッチされます)。

于 2012-12-22T13:41:54.347 に答える
0

私はその解決策が好きです。

// app.xaml.cs

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private FirstTask firstTask;

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        BackgroundWorker backWorker = new BackgroundWorker();
        backWorker.DoWork += new DoWorkEventHandler(backWorker_DoWork);
        backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backWorker_RunWorkerCompleted);
        backWorker.RunWorkerAsync();

        MainWindow mainWindow = new MainWindow();
        firstTask = new FirstTask();

        firstTask.ShowDialog();

        mainWindow.Show();
    }

    void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        firstTask.Close();
    }

    void backWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(5000);
    }
}

BackgroundWorker を使用してバックグラウンドでタスクを実行しています。タスクが完了したら、firstTask を閉じて mainWindow を表示します。

重要な注意: 最初のタスクを閉じた後に mainWindow を表示するには、mainWindow を firstTask.ShowDialog() の前に宣言する必要があります。

于 2012-12-22T20:52:51.057 に答える