可悲的是,在stackoverflow上没有关于这个问题的单一问题。至少,没有我在搜索时碰到的。
无论如何,当我要谈论的程序正在构建时。出现的第一个窗口是登录。当用户输入正确的登录信息时,将显示主窗口。但是,在主窗口上有大量信息是从互联网上收集的。
这使得主窗口保持透明,如下图[1]所示,持续一段合理的时间。从互联网收集的信息包括一些xml以及来自MySQL数据库的数据。
我有一个类似的Window_Loaded事件;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
method1();
method2(1);
method3();
.
.
.
//method6();
}
所以,很明显,当我取消某些方法并让这个事件少于时间时,窗口在进入正常状态之前保持透明,变得更小。
但是,我想要做的是正常加载窗口,然后可能有加载指示器来通知用户正在加载内容。
p.s我正在使用mahapps.metro控件。
提前谢谢
答案 0 :(得分:1)
这是因为你在UI线程上运行阻塞代码,因此窗口没有机会重新绘制。
你需要在后台线程中完成所有这些工作。
答案 1 :(得分:0)
试试这个
MainWindow和Code。
<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();
}
}
启动画面和代码
公共部分类Splash:Window { private static Splash splash = new Splash();
// 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);
}
}
App Class xaml和Code
<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();
}
}