我有一个小型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,但它仍然没有改变。按钮在运行方法时锁定,然后仅在方法结束时更新其布局。我需要做些什么来更新布局?
答案 0 :(得分:1)
在finally(总是执行)中,你设置:
Read.IsEnabled = true;
Read.Content = "Read";
此外:如果在UI线程上运行的同一函数中多次更改按钮的属性,则不会看到任何更改,因为更新将太快,因为UI线程在方法执行后更新UI
如果要查看更改,可以使用后台工作程序,并在ProgressChanged处理程序中更新UI。
答案 1 :(得分:0)
这是因为你在同一个线程上完成所有操作,因此控件永远不会返回到WPF,以便它可以更新状态。您需要将工作拆分为多个线程(请参阅BackgroundWorker
组件)或使用单独的消息设置按钮状态(请参阅Dispatcher
类)。