【问题标题】:Button to change content and back to original state on click of it单击按钮可更改内容并返回原始状态
【发布时间】:2012-02-21 18:30:07
【问题描述】:

我有一个名为“验证”的按钮。单击时,它的内容应更改为“正在验证...”,处理完成后应显示“已验证”。我们应该如何做到这一点?我是 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)); 
}

【问题讨论】:

  • 你有没有尝试过任何东西,如果有,你能提供代码来说明你卡在哪里吗?
  • private void btnVerify_Click(object sender, RoutedEventArgs e) { btnVerify.Content = new BitmapImage(new Uri("Verifying.png", UriKind.Relative));验证数据(); // 这需要几秒钟到几分钟 btnVerify.Content = new BitmapImage(new Uri("Verified.png", UriKind.Relative)); }
  • @user1222006 - 请下次在您的问题中发布该代码,并使用代码标记(每行开头四个空格)以便于阅读和理解。谢谢。
  • 是否所有VerifyData() 代码都在 UI 线程上执行?

标签: c# wpf


【解决方案1】:

因为您是 WPF 的新手,所以我假设您没有使用 MVVM。在这种情况下:

挂钩Click 事件和方法:

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

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

【讨论】:

  • 你是对的,我不确定 MVVM 并将通过它。顺便说一句,我正在尝试下面的代码,它总是显示已验证。 private void btnVerify_Click(object sender, RoutedEventArgs e) { btnVerify.Content = new BitmapImage(new Uri("Verifying.png", UriKind.Relative));验证数据(); btnVerify.Content = new BitmapImage(new Uri("Verified.png", UriKind.Relative)); }
  • 这可能是因为VerifyData() 代码执行得如此之快...在VerifyData() 之后立即放置一个System.Threading.Thread.Sleep(3000); 以查看是否是问题所在。
【解决方案2】:

这里没什么可做的,但我想我可以回答你的问题。在我看来,有几种简单的方法可以做到这一点。

首先,您可以在按钮启动的任何进程结束时再次将按钮的文本更改为“验证”。例如:

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

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

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

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

编辑 从您发布的更新信息来看,您的屏幕刷新可能存在问题。这很可能是因为您正在执行一个同步过程,该过程会锁定更新,直到整个过程完成。解决此问题的一种方法(hack)是按照此处列出的说明进行操作:

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

不过,我更希望看到您将这段代码重构为对线程更友好。如果该过程花费的时间足够长,以至于您需要在屏幕上看到等待指示符(例如“验证...”),我建议您使用后台工作程序或其他类型的异步进程来处理实际工作,以便您的UI 没有锁定。然而,这是一个更高级的主题,可能超出了您作为初学者想要学习的范围。如果是这样,我建议要么现在就进行上述黑客攻击,要么只是忍受这个问题。

【讨论】:

  • 谢谢比格斯,但不知何故,当点击事件的整个过程完成时,它会更新按钮文本。我错过了什么吗?
  • 你能在你的问题中发布一些代码来告诉我们你在做什么吗?听起来您可能正在执行所有正确的步骤,但在流程完成并将其改回之前,屏幕可能没有刷新说“正在验证...”。这将是执行同步过程的结果。修复类似的东西会有点复杂。
  • 在继续代码之前,您需要告诉应用程序处理文本更改。例如,您可以调用类似:System.Windows.Forms.Application.DoEvents
  • @AlexMendez - 我不相信这会在 WPF 中起作用。他需要做一些更复杂的事情,比如:geekswithblogs.net/NewThingsILearned/archive/2008/08/25/…
  • @BiggsTRC - System.Windows.Forms.Application.DoEvents 在下面提到:stackoverflow.com/questions/2667370/how-do-i-doevents-in-wpf。这是我得到信息的地方。没有亲自测试过。
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 2014-03-23
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多