WPF元素事件处理程序中的UI更新



WPF中的UI更新出现问题。

我有这样的代码:

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";
        LongTimeMethod(); //some long operation
    }

问题是,在LongTimeMethod结束(即事件处理程序结束)之前,Label.Visibility和TextBox.Text将不会更改。

到目前为止,我是这样解决的:

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";
        Dispatcher.BeginInvoke(new Action(LongTimeMethod), 
            DispatcherPriority.Background);
    }

有没有其他不使用调度程序调用的解决方案?呼叫此。UpdateLayout()没有帮助。

对于Dispatcher.BeginInvoke,您仍在使用LongTimeMethod()的UI线程。如果这不是必需的(即它正在进行某种后台处理),我建议使用TPL在后台线程上运行它:

private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
    Label.Visibility = Visibility.Visible;
    TextBox.Text = "Processing...";
    Task.Factory.StartNew(() => LongTimeMethod())
        .ContinueWith(t =>
        {
            Dispatcher.BeginInvoke((Action)delegate()
            {
                TextBox.Text = "Done!";
            });
        });
}

使用此方法,长时间运行的方法在后台线程上进行处理(因此UI线程可以自由地继续渲染,应用程序也不会冻结),并且当后台任务完成时,您可以在UI Dispatcher上做任何改变UI的事情(如更新文本框文本)

可见性和文本是由调度器更新的依赖属性。你的解决方案是完全正确的,但我的建议是异步进行。

另一方面,您可以在WPF中模拟Application.DoEvents(请参阅文章)。

相关内容

  • 没有找到相关文章

最新更新