2013-02-11 175 views
4

我從一些窗口窗口1導航到主窗口爲WPF窗口加載等待屏幕

在我MainWindow_loaded方法我有太多的計算,所以當我瀏覽到主窗口中的窗口變白,直到所有的計算完成,窗口中加載

我試圖在主窗口

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中顯示等待欄和所有數據計算?

我已經使用ExtendedWpfToolkit爲_busy這是繁忙的指標

回答

4

您可以訂閱你的背景工作者報告進展。

worker.WorkerReportsProgress = true; 

現在,您可以通過您訂閱的事件觸發此進度報告。

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 

這樣做,你可以創建一個進度條可以比基於此worker_ProgressChanged事件,通過你的計算引發的自我更新。

看起來你已經想出了IsBusy,所以你可以讓你的進度條只在這是真的時才顯示。

0

一種選擇是創建一個覆蓋其可見性取決於IsBusy,樣品來一次我不是我的手機上

4

您可以使用BusyIndicator控件。它是Extended WPF ToolKit.的一部分

我已經創建了一個使用它的示例應用程序。下面是顯示循環計數的應用程序的屏幕截圖。

Waiting Screen

Here是如何使用它的教程。

示例代碼。

注意:您需要下載工具包,並在項目中添加對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> 

代碼隱藏:

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(); 
     } 

    } 
} 
+0

這就是我在我的代碼做以上我已經使用WPF extendedtool套件 – uncia 2013-02-11 18:12:51