按钮状态不更新

时间:2012-02-10 08:55:18

标签: wpf layout button

我有一个小型WPF应用程序。此应用程序有一个按钮,单击该按钮时,其文本应更改并禁用。我的按钮事件处理程序的代码如下:

/// <summary>
/// 'Read' button clicked
/// </summary>
/// <param name="sender"></param>
/// <param name="routedEventArgs"></param>
private void ReadVersionNumber(object sender, RoutedEventArgs routedEventArgs)
{
  Read.Content = "Reading....";
  Read.IsEnabled = false;

  SerialPort p = new SerialPort();
  string response = "Could not read version";

  try
  {
    // Do some stuff
  }
  catch (Exception)
  {
    response = "There was an error while reading the version number";
  }
  finally
  {
    Read.IsEnabled = true;
    Read.Content = "Read";

    if(p.IsOpen)
    {
      p.Close();
    }
  }

  Version.Text = response;
}

问题是我的按钮文本永远不会改变,并且它不会被禁用。我已经尝试在设置按钮属性后调用UpdateLayout,但它仍然没有改变。按钮在运行方法时锁定,然后仅在方法结束时更新其布局。我需要做些什么来更新布局?

2 个答案:

答案 0 :(得分:1)

在finally(总是执行)中,你设置:

Read.IsEnabled = true;
Read.Content = "Read";

此外:如果在UI线程上运行的同一函数中多次更改按钮的属性,则不会看到任何更改,因为更新将太快,因为UI线程在方法执行后更新UI

如果要查看更改,可以使用后台工作程序,并在ProgressChanged处理程序中更新UI。

答案 1 :(得分:0)

这是因为你在同一个线程上完成所有操作,因此控件永远不会返回到WPF,以便它可以更新状态。您需要将工作拆分为多个线程(请参阅BackgroundWorker组件)或使用单独的消息设置按钮状态(请参阅Dispatcher类)。