有人可以帮我理解为什么这段代码不起作用吗?
我想做的是:点击按钮,更改按钮内容并锁定它,执行外部线程,最后解锁按钮并再次更改内容
private void button3_Click(object sender, RoutedEventArgs e)
{
button3.Content = "Printing...";
button3.IsEnabled = false;
Thread.Sleep(1000);
button3.IsEnabled = true;
button3.Content = "Print";
}
最佳答案
您看到此行为的原因是您的方法(处理按钮的 Click
事件)与 UI 在同一线程上运行。这个概念是使用 UI 代码时常见的问题根源。
简单地说,在您的方法完成之前,无法重新绘制 UI。在该方法中,您禁用按钮,等待 1 秒钟,然后重新启用按钮 - 然后 UI 将重新绘制,按钮启用。因此,您永远不会在屏幕上看到禁用的按钮(并且在 sleep
发生时您的应用程序将卡住 1 秒)。
您需要做的是研究可用于在后台线程上运行任务的方法之一。您的方法应该创建并启动该线程,将按钮设置为禁用,然后完成 - 允许 UI 线程将按钮绘制为禁用。任务完成后,您应该再次将按钮设置为启用(请注意,通常在 WPF 中,这意味着使用 Dispatcher.Invoke
来确保从 button.Enabled
设置UI 线程)。
要创建后台任务,您可以查看 System.Threading
命名空间(特别是 Thread.Start
方法)或 Task Parallel Library ,或 BackgroundWorker类(class)。我怀疑 TPL 将是您最简单的起点。
关于c# - WPF C# 锁定/解锁按钮并执行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766029/