如何在WPF应用程序中临时禁用按钮?

时间:2016-10-31 12:07:11

标签: c# wpf xaml

我是WPF的新手,仍在寻找一种简单的解决方案来临时停用我的应用程序中的按钮。这就是我在做的事情:

按钮点击:

private void Calculate_Click(object sender, RoutedEventArgs e)
    {
      this.AreButtonsEnabled = false;
      System.Threading.Thread.Sleep(1000);
      this.AreButtonsEnabled = true;      
    }

XAML:

<Button x:Name="OtherButton" IsEnabled="{Binding AreButtonsEnabled}" Content="OtherButton" HorizontalAlignment="Left" Margin="165,152,0,0" VerticalAlignment="Top" Width="75"/>

绑定按预期工作,但如果我激活和停用此一次调用中的按钮,则不会停用。如何让GUI正确停用按钮?

修改

通知事件(工作正常):

public partial class MainWindow : Window, INotifyPropertyChanged
  {

    private bool areButtonsEnabled;
    public bool AreButtonsEnabled
    {
      get { return this.areButtonsEnabled; }
      set { areButtonsEnabled = value; OnPropertyChanged(new PropertyChangedEventArgs("AreButtonsEnabled")); }
    }

注意 我必须.Net 3.5。

2 个答案:

答案 0 :(得分:1)

Thread.Sleep()阻止UI线程。您可以使用async点击处理程序代替Task.Delay()

private async void Calculate_Click(object sender, RoutedEventArgs e)
{
    AreButtonsEnabled = false;
    await Task.Delay(1000);
    AreButtonsEnabled = true;      
}

答案 1 :(得分:1)

最好是禁用按钮,然后启动/使用另一个线程来完成工作并在最后启用按钮(一种方法是在一种方法中使用async / await),这样UI将会保持负责任和最新。

伪代码:

private async void Calculate_Click(object sender, RoutedEventArgs e)
{
    AreButtonsEnabled = false;
    await Task.Run(()=>DoWork());
    AreButtonsEnabled = true;      
}