按钮状态不更新
问题描述:
我有一个小的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,但它仍然没有改变。该按钮在运行该方法时锁定,然后仅在方法结束时更新其布局。我需要做什么来更新布局?
答
在最后(始终执行)设置:
Read.IsEnabled = true;
Read.Content = "Read";
另外:如果你在UI线程,你不会看到任何变化上运行同样的功能更改按钮的属性多次因为更新将过快,因为UI线程在执行该方法后更新UI。
如果您想查看更改,可以使用backgroundworker并在ProgressChanged处理程序中更新UI。
答
这是因为你在同一个线程上执行所有操作,所以控制永远不会返回到WPF,以便它可以更新状态。您需要将工作分解到多个线程(请参阅BackgroundWorker
组件)或使用单独的消息设置按钮状态(请参阅Dispatcher
类)。