【问题标题】:Refresh WPF-Control by code通过代码刷新 WPF-Control
【发布时间】:2011-10-14 04:09:36
【问题描述】:

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

我使用 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;
}

【问题讨论】:

    标签: c# wpf controls refresh


    【解决方案1】:

    更好的是,与其搞乱事件,不如使用 ICommand 绑定,在那里你可以实现 CanExecute,你可以根据你是否要启用/禁用按钮来返回 true/false

    Great example here on ICommand

    【讨论】:

    • 我在这里投票。永远不要以老式的方式管理 WPF UI。
    • 完全正确。更多代码来管理 UI 状态,因为 WPF 已经有很好的 ICommand 绑定!
    【解决方案2】:

    由于所有似乎都发生在 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();
    

    【讨论】:

    • +1 我在 SO 上看到了很多关于这个问题的答案。这是我见过的最灵活和最可靠的。
    【解决方案3】:

    您正在将方法的优先级设置为 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2017-05-11
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多