可能不是最好的办法,但是用起来效果也还是可以的。
原理:通过IsEnabled属性来控制按钮状态。btnConfirm.IsEnabled / this.IsEndbled 这两种方式是等价的。
案例比较简单,如果后期做开发的话代码量变大,只在结尾添加 this.IsEndbled = true ,逻辑上是有缺陷的。如果txtName为空是不是又要给IsEndbled = True 这样重新赋值。 如果是多个if条件呢这样的话会很繁琐。
所以我就用上了异常捕获
使用 try{ 要执行的代码 }catch(Exception ex){ 异常 }finally{ 最后执行的代码 }
finally
当一个异常抛出时,它会改变程序的执行流程。因此不能保证一个语句结束后,它后面的语句一定会执行,在 C# 中这个问题可以用 finally 解决。
为了确保一个语句总是能执行(不管是否抛出异常),需要将该语句放到一个 finally 块中,finally 要么紧接在 try 块之后,要么紧接在 try 块之后的最后一个 catch 处理程序之后。只要程序进入与一个 finally 块关联的 try 块,则 finally 块始终都会运行 -- 即使发生了一个异常。
Xaml代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<TextBox Name="txtName" Height="30" />
<ProgressBar Name="progressBar1" Maximum="100" Height="42" />
<Label Name="label1"></Label>
<Button Name="btnConfirm" Click="Button_Click_1" Height="30" Content="添加" />
</StackPanel>
</Grid>
</Window>
C#代码:
namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
this.IsEnabled = false;
try
{
if (!string.IsNullOrEmpty(txtName.Text))
{
MessageBox.Show("用户名称不能为空!");
//this.IsEnabled = true;
return;
}
for (int i = 0; i <= 100; i++)
{
progressBar1.Value = i;
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(10);
label1.Content = "数据正在加载中(" + i + ")";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"错误",MessageBoxButton.OK,MessageBoxImage.Error);
}
finally
{
this.IsEnabled = true;
}
}
}
}