4

我正在从某个窗口 window1 导航到 Mainwindow

在我的 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 中显示等待栏和所有数据计算?

我已将 ExtendedWpfToolkit 用于 _busy ,它是忙碌指示符

4

4 回答 4

4

你可以使用BusyIndicator控制。它是扩展 WPF 工具包的一部分。

我已经使用它创建了一个示例应用程序。下面是显示循环计数的应用程序的屏幕截图。

等待画面

是有关如何使用它的教程。

示例代码。

注意:您需要下载工具包并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();
        }

    }
}
于 2013-02-11T16:10:20.133 回答
4

您可以订阅后台工作人员以报告进度。

worker.WorkerReportsProgress = true;

现在,您可以通过订阅的事件触发此进度报告。

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);

这样做时,您可以创建一个进度条,该进度条可以基于此worker_ProgressChanged事件自行更新,由您的计算触发。

看来你已经想通了IsBusy,所以只有当这是真的时,你才能让你的进度条显示出来。

于 2013-02-11T15:15:35.100 回答
0

一种选择是创建一个覆盖层,其可见性取决于 IsBusy,一旦我不在手机上就会出现示例

于 2013-02-11T15:12:03.017 回答
0

最简单的方法是使用带有 xaml 的 WPF 进度条,下面是代码:

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

其中 IsIndeterminate 'true' 的行为类似于等待进度,而 'false' 将显示确切的进度。当您想显示时,还设置可见性,如果您用作等待进度,则在隐藏时设置可见性。

于 2018-07-26T06:18:13.857 回答