我有一个简单的窗口:
<Window x:Class="Prestress.UI.StatusWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:Prestress.UI"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
SizeToContent="WidthAndHeight"
WindowStyle="None"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="{Binding Path=StatusText, Source={x:Static l:ProjectProperties.Instance}}"/>
</Grid>
</Window>
同样琐碎的代码隐藏:
public partial class StatusWindow : Window
{
public StatusWindow()
{
Topmost = true;
InitializeComponent();
}
}
此窗口仅用于在程序在后台运行时向用户显示一些消息。此类的唯一实例包含在以下内容中:
public sealed class ProjectProperties : DependencyObject, INotifyPropertyChanged
{
static ProjectProperties instance = new ProjectProperties();
public static StatusWindow Status = new StatusWindow();
string statusText;
public static ProjectProperties Instance { get { return instance; } }
public string StatusText
{
get { return statusText; }
set
{
statusText = value;
EmitPropertyChanged("StatusText");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void EmitPropertyChanged(string property)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
public static void UpdateStatusWindow(string s)
{
Instance.StatusText = s;
}
public static void ShowStatusWindow()
{
Status.InitializeComponent();
Status.Show();
}
}
ProjectProperties 是一个包含此窗口静态副本的单例类。
它必须出现的第一条消息是&#34;验证数据&#34;。这是通过调用
来完成的ProjectProperties.UpdateStatusWindow("Validating data.");
ProjectProperties.ShowStatusWindow();
结果就是这个
然而,这个窗口很快就会出现 MessageBox ,它会抱怨用户输入的内容有误。当出现 MessageBox 时,将刷新窗口,显示所需的文本。
这对我来说似乎很奇怪。可以看出,即使空白,窗口已经自己调整大小以使文本适合。所有缺失的是绘制文本。在调用.InitializeComponent()
时,我的第一次尝试甚至没有包含.ShowStatusWindow()
行,但后来我看到this并尝试添加它,但没有成功。关于这里发生了什么的任何想法?
答案 0 :(得分:0)
您可能在UI线程上“验证数据”。如果此验证很重,则UI线程会忙于执行验证,并且无法呈现UI(这是主要用途)。
您可以显示带有“验证数据”的消息窗口,然后启动后台线程(请参阅BackgroundWorker)进行验证,最后在RunWorkerCompleted
事件更新中UpdateStatus()
显示“验证”完成“(或什么适合你)。这不会阻止UI线程,并且应该解决您的消息文本没有显示问题。
答案 1 :(得分:0)
你编码本身对我来说很好看。但是,它没有显示的关键部分是它必须使用GUI线程进行一些验证工作,这需要一些时间。因此,GUI线程被阻塞,直到完成所有工作,然后更新GUI。
为了实现您想要的功能,您需要使用另一个线程来进行验证,以便GUI线程可以继续更新GUI而不会被阻止。
您可以按照其他人的建议使用BackgroundWorker,这是一个更强大的选项,或者只是使用验证线程中的Dispatcher.Invoke()来更新GUI。