4

いくつかのウィンドウwindow1からメインウィンドウに移動しています

MainWindow_loadedメソッドでは、計算が多すぎるため、メインウィンドウに移動すると、すべての計算が終了してウィンドウが読み込まれるまで、ウィンドウが白くなります。

MainWindowで試してみました

 private void MainWindow_Loaded_1(object sender, RoutedEventArgs e)

 BackgroundWorker worker = new BackgroundWorker();

       worker.DoWork += (o, ea) =>
        {
             do large computation
          };

          worker.RunWorkerCompleted += (o, ea) =>
           {

               _busy.IsBusy = false;
          };
         _busy.IsBusy = true;
         worker.RunWorkerAsync();

}

しかし、問題は、ロードされたイベントハンドラーで必要なデータを計算せずにメインウィンドウに移動し、UIに待機バーが表示されないことです。?MainWindow_Loadedで待機バーとデータのすべての計算を表示することは可能ですか?

ビジーインジケーターである_busyにExtendedWpfToolkitを使用しました

4

4 に答える 4

4

バックグラウンドワーカーをサブスクライブして、進捗状況を報告できます。

worker.WorkerReportsProgress = true;

そして今、あなたはあなたが購読しているイベントによってこの進捗レポートをトリガーさせることができます。

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);

worker_ProgressChangedそうすることで、計算によってトリガーされたこのイベントに基づいて自分自身を更新できるプログレスバーを作成できます。

すでに理解しているIsBusyように見えるので、これが当てはまる場合にのみプログレスバーを表示できます。

于 2013-02-11T15:15:35.100 に答える
4

コントロールを使用できますBusyIndicator。これは、ExtendedWPFToolKitの一部です。

それを使ってサンプルアプリを作成しました。以下は、ループカウントを表示するアプリのスクリーンショットです。

待機画面

これがその使い方のチュートリアルです

サンプルコード。

注:ツールキットをダウンロードして、プロジェクトにへの参照を追加する必要がありXceed.Wpf.Toolkit.dllます。

XAMLコード:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WPFTool="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
        Title="MainWindow" Height="200" Width="300" Loaded="Window_Loaded">
    <WPFTool:BusyIndicator Name="BusyIndicator">
        <Grid>
        </Grid>
    </WPFTool:BusyIndicator>
</Window>

CodeBehind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Threading;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            BusyIndicator.IsBusy = true;
            BusyIndicator.BusyContent = "Initializing...";
            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += (o, a) =>
                {
                    for (int index = 0; index < 5; index++)
                    {
                        Dispatcher.Invoke(new Action(() =>
                        {
                            BusyIndicator.BusyContent = "Loop : " + index;
                        }), null);
                        Thread.Sleep(new TimeSpan(0, 0, 1));
                    }
                };
            worker.RunWorkerCompleted += (o, a) =>
                {
                    BusyIndicator.IsBusy = false;
                };
            worker.RunWorkerAsync();
        }

    }
}
于 2013-02-11T16:10:20.133 に答える
0

1つのオプションは、可視性がIsBusyに依存するオーバーレイを作成することです。サンプルは、電話を使用していないときに表示されます。

于 2013-02-11T15:12:03.017 に答える
0

これを行う最も簡単な方法は、xamlでWPFプログレスバーを使用することです。以下はコードです。

<ProgressBar IsIndeterminate="True" Visibility="True"/>

ここで、IsIndeterminateの「true」は待機中の進行状況のように動作し、「false」は正確な進行状況を示します。また、表示する場合と、待機中の進行状況として使用している場合は非表示にする場合の可視性を設定します。

于 2018-07-26T06:18:13.857 に答える