我正在尝试禁用拒绝垃圾邮件点击此按钮的按钮。
我使用了一个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;
}
答案 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取决于你是否要启用/禁用按钮
答案 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);
}