单击按钮可更改内容并返回原始状态

时间:2012-02-20 21:00:20

标签: c# wpf

我有一个名为"验证"的按钮。单击时,它应将其内容更改为"正在验证..."一旦处理完成,它应显示"已验证"。我们该如何实现这一目标?我是wpf的新手。任何帮助将不胜感激。

private void btnVerify_Click(object sender, RoutedEventArgs e)  
{  
    btnVerify.Content = new BitmapImage(new Uri("Verifying.png", UriKind.Relative));
    VerifyData(); // this takes almost few seconds to few minutes 
    btnVerify.Content = new BitmapImage(new Uri("Verified.png", UriKind.Relative)); 
}

2 个答案:

答案 0 :(得分:0)

这里没有多少工作,但我想我可以回答你的问题。正如我所看到的,有几种简单的方法可以做到这一点。

首先,你可以在任何开始的过程结束时再次将按钮的文本更改为“验证”。例如:

OnClick()
{
   Button.Text = "Verifying...";
   DoSomething();
}

DoSomething()
{
   ...
   Button.Text = "Verify";
}

这种方法的问题在于它快速而且肮脏。它假定您直接通过代码修改视图(用户界面)。它还假设您的DoSomething方法也可以操纵您的View。不是最佳做法,但很简单。

另一种方法是在流程完成时触发事件。您的表单(或ViewModel)可以侦听要触发的事件,然后将按钮的文本值更改回“验证”。这本质上是一种更好的实践,特别是如果您使用的是MVVM之类的东西,并且您在ViewModel中执行此操作。由于您可以从ViewModel获取按钮的文本,因此您可以最初更改它,最后从那里更改。

修改 根据您发布的更新信息,您可能会遇到屏幕刷新问题。这很可能是因为您正在执行一个锁定更新的同步过程,直到整个过程完成。解决这个问题的一种方法(黑客)将遵循此处列出的指示:

http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx

我宁愿看到你重构这段代码,以便更加线程友好。如果过程花费的时间足够长,你需要在屏幕上看到一个等待指示器(如“验证...”),我建议使用后台工作程序或其他一些异步过程来处理实际工作,以便你的用户界面没有锁定。然而,这是一个更高级的主题,可能超出了您想要作为初学者学习的范围。如果是这样的话,我建议现在就做上述黑客攻击,或者只是解决这个问题。

答案 1 :(得分:0)

因为你是WPF的新手,我假设你没有使用MVVM。在那种情况下:

挂钩到Click事件和方法:

OnVerifyClick(object sender, RoutedEventArgs e)
{
    Button verifyButton = sender as Button;
    if(verifyButton == null) { return; }

    verifyButton.Content = "Verifying...";
    DoProcessing();
    verifyButton.Content = "Verified";    
}