2013-02-11 345 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