c# - 通过代码刷新 WPF-Control

标签 c# wpf controls refresh

我正在尝试禁用一个按钮以拒绝垃圾邮件点击此按钮。

我使用刷新委托(delegate)来渲染调用控件,但它显示为已启用。 connect()-方法在按钮显示为已启用时大约需要 4 秒。

问题出在哪里?

public static class ExtensionMethods
{

   private static Action EmptyDelegate = delegate() { };


   public static void Refresh(this UIElement uiElement)
   {
      uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
   }
}


private void buttonConnect_Click(object sender, RoutedEventArgs e)
{
    this.Cursor = Cursors.Wait;
    buttonConnect.IsEnabled = false;
    buttonConnect.Refresh();

    if (buttonConnect.Content.Equals("Connect"))
    {
        connect();
    }
    else
    {
        disconnect();
    }
    buttonConnect.IsEnabled = true;
    buttonConnect.Refresh();
    this.Cursor = Cursors.Arrow;
}

最佳答案

由于所有似乎都发生在 UI 线程上,因此 UI 没有时间更新,您需要在后台线程上运行您的任务并在完成时再次更改 UI(例如使用 BackgroundWorker,它已经有一个 RunWorkerCompleted 事件)。

例如

button.IsEnabled = false;
var bw = new BackgroundWorker();
bw.DoWork += (s, _) =>
{
    //Long-running things.
};
bw.RunWorkerCompleted += (s,_) => button.IsEnabled = true;
bw.RunWorkerAsync();

关于c# - 通过代码刷新 WPF-Control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843327/

相关文章:

c# - 如何用 lambda 解决这个问题

c# - 无法以正确的格式对特殊字符电子邮件进行编码,gmail api & ae.net.mail

c# - 属性初始化和比较时间

wpf - 如何在WPF中获取打印机的DPI

C 控制字符串?

windows - 什么是无窗口控件?

c# - 使用linq按子集合的属性进行过滤

c# - DeviceInformation PairAsync 在 WPF 中不起作用

数据随机分布

c# - NServiceBus 升级 2.5 到 3.2 总是重新安装 MSMQ,有没有办法阻止这个?