按代码刷新WPF-Control

时间:2011-07-27 11:07:58

标签: c# wpf controls refresh

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

我使用了一个Refresh委托来渲染调用控件,但它显示为已启用。 connect() - Methode大约需要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;
}

3 个答案:

答案 0 :(得分:4)

由于所有这些似乎都发生在UI-Thread上,UI没有时间在其间进行更新,您需要在后台线程上运行任务并在完成时再次更改UI(例如使用{{3} }已经有RunWorkerCompleted事件。

e.g。

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

答案 1 :(得分:1)

更好,而不是搞乱事件,为什么不使用ICommand绑定,你可以实现CanExecute,你可以返回true / false取决于你是否要启用/禁用按钮

Great example here on ICommand

答案 2 :(得分:0)

您正在将方法的优先级设置为Render,它实际上不会进行任何渲染。

我想说使用异步调用将是最好的操作,给布局引擎时间渲染:

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

    Action action = buttonConnect.Content.Equals("Connect") ? connect : disconnect;

    new Action(() => {
        action();
        Dispatcher.Invoke(() =>
            {
                buttonConnect.IsEnabled = true;
                this.Cursor = Cursors.Arrow;
            });
    }).BeginInvoke(null, null);
}