WPF窗口的延迟更新

时间:2014-09-03 02:43:54

标签: c# wpf windows

我有一个简单的窗口:

<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();

结果就是这个

blank window

然而,这个窗口很快就会出现 MessageBox ,它会抱怨用户输入的内容有误。当出现 MessageBox 时,将刷新窗口,显示所需的文本。

updated window

这对我来说似乎很奇怪。可以看出,即使空白,窗口已经自己调整大小以使文本适合。所有缺失的是绘制文本。在调用.InitializeComponent()时,我的第一次尝试甚至没有包含.ShowStatusWindow()行,但后来我看到this并尝试添加它,但没有成功。关于这里发生了什么的任何想法?

2 个答案:

答案 0 :(得分:0)

您可能在UI线程上“验证数据”。如果此验证很重,则UI线程会忙于执行验证,并且无法呈现UI(这是主要用途)。

您可以显示带有“验证数据”的消息窗口,然后启动后台线程(请参阅BackgroundWorker)进行验证,最后在RunWorkerCompleted事件更新中UpdateStatus()显示“验证”完成“(或什么适合你)。这不会阻止UI线程,并且应该解决您的消息文本没有显示问题。

答案 1 :(得分:0)

你编码本身对我来说很好看。但是,它没有显示的关键部分是它必须使用GUI线程进行一些验证工作,这需要一些时间。因此,GUI线程被阻塞,直到完成所有工作,然后更新GUI。

为了实现您想要的功能,您需要使用另一个线程来进行验证,以便GUI线程可以继续更新GUI而不会被阻止。

您可以按照其他人的建议使用BackgroundWorker,这是一个更强大的选项,或者只是使用验证线程中的Dispatcher.Invoke()来更新GUI。