如何在处理函数的其余部分之前更新WPF中的UI元素?

xcitsw88  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(125)

我想在用户单击某个按钮时立即禁用该按钮,以阻止他们再次单击该按钮。在用户单击该按钮时会执行许多检查,而且这些检查似乎是在UI更改发生之前完成的。
我试图通过为按钮使用一个单独的线程来做到这一点,但它似乎仍然只在检查完成后更新。
下面是我使用的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Thread t = new Thread(new ThreadStart(
     delegate
     {
         Action action = () => btnStart.IsEnabled = false;
         Dispatcher.BeginInvoke(action);
     }
     ));
     t.Start();          
    // Run the main routine;
    BeginBootstrapping();
}

如何立即禁用该按钮?

ncecgwcz

ncecgwcz1#

您可以编写一个async Click处理程序,该处理程序使用Task来运行一些后台工作:

using System.Threading.Tasks;
...

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    button.IsEnabled = false;

    await Task.Run(() => DoTheBootstrapping());

    button.IsEnabled = true;
}

当然,如果您可以让长时间运行的方法本身变得可等待,就像

private async Task DoTheBootstrapping()
{
    var httpClient = new HttpClient();
    var content = await httpClient.GetStringAsync("http://stackoverflow.com");
}

您可以不使用Task.Run来调用它,例如

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    button.IsEnabled = false;

    await DoTheBootstrapping();

    button.IsEnabled = true;
}
yws3nbqq

yws3nbqq2#

private void Button_Click(object sender, RoutedEventArgs e)
{
    btnStart.IsEnabled = false
    Thread t = new Thread(new ThreadStart(
    delegate
    {
        // Run the main routine;
        BeginBootstrapping();
    }));

    t.Start();
}

就像Evk在他的评论中说的那样,这会在UI线程的主线程中禁用按钮,然后在另一个线程上运行剩下的工作。注意我没有使用Dispatcher,因为Dispatcher实际上也是UI线程,使用它会冻结UI。

相关问题