0

可悲的是,在 stackoverflow 上没有一个关于这个问题的问题。至少,我在搜索时没有碰到。

无论如何,当我要谈论的程序是构建时。出现的第一个窗口是登录。当用户输入正确的登录信息时,将显示主窗口。但是,在主窗口中有大量从互联网收集的信息。

这会导致主窗口在一段合理的时间内保持透明,如下图 [1] 所示。从互联网收集的信息由一些 xml 以及来自 MySQL db 的数据组成。

我有一个看起来像的 Window_Loaded 事件;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        method1();
        method2(1);
        method3();
        .
        .
        .
        //method6();
    }

因此,很明显,当我取消某些方法并以更少的时间离开此事件时,窗口在进入正常状态之前保持透明,变得更小。

但是,我想要做的是让窗口正常加载,然后可能有加载指示器来通知用户正在加载内容。

ps 我正在使用 mahapps.metro 控件。

先感谢您

4

2 回答 2

1

发生这种情况是因为您在 UI 线程上运行阻塞代码,因此窗口没有机会重新绘制。
您需要在后台线程中完成所有这些操作。

于 2012-09-06T13:37:51.980 回答
0

试试这个

主窗口和代码。

<Window x:Class="SplashScreenWithStatus.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="800" Loaded="Window_Loaded">
    <Grid>

    </Grid>
</Window>



 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            // Setting the status to show the application is still loading data
            Splash.Loading("Connecting...");
            // Set to sleep to simulate long running process
            Thread.Sleep(1500);
            Splash.Loading("Retrieving....");
            Thread.Sleep(1500);
            Splash.Loading("Success....");
            Thread.Sleep(1500);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Splash.EndDisplay();
        }
    }

启动画面和代码

公共部分类飞溅:窗口{私有静态飞溅飞溅=新飞溅();

    // To refresh the UI immediately
    private delegate void RefreshDelegate();
    private static void Refresh(DependencyObject obj)
    {
        obj.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render,
            (RefreshDelegate)delegate { });
    }

    public Splash()
    {
        InitializeComponent();
    }

    public static void BeginDisplay()
    {
        splash.Show();
    }

    public static void EndDisplay()
    {
        splash.Close();
    }

    public static void Loading(string test)
    {
        splash.statuslbl.Content = test;
        Refresh(splash.statuslbl);
    }

    }

应用类 xaml 和代码

<Application x:Class="SplashScreenWithStatus.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml" Startup="Application_Startup">
    <Application.Resources>

    </Application.Resources>
</Application>

 public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Splash.BeginDisplay();
        }
    }
于 2012-09-06T14:12:35.533 回答