【问题标题】:WPF Animated ProgressBar in WinForms applicationWinForms 应用程序中的 WPF 动画进度条
【发布时间】:2011-12-12 16:01:02
【问题描述】:

我有一个 WinForms 应用程序,并想添加一些不错的 WPF 控件,其中一个是“不确定”进度条。它的动画效果很好,直到我告诉它停止。

我已经这样做了,并且正在绞尽脑汁想为什么它没有动画(更改进度条的值)。

我最终尝试以模态方式显示我的表单(包含 ElementHost),嘿,它会动画,但我想以非模态方式显示表单,因为我想继续在幕后处理。

是否有某种设置可以告诉 ElementHost 窗口继续“动画”?

谢谢 丰富。

【问题讨论】:

  • 我过去做过类似的事情(通过 WinForms 应用程序中的 ElementHost 的 WPF 进度条)并且没有遇到您描述的问题。您是否尝试在新项目中隔离并重现该行为?
  • 不,但我可以......这很简单。
  • 好的,我在一个单独的项目中完成了这项工作,首先它起作用了,但是当我尝试进行一些处理和 thread.sleep 时,它停止了动画。也许我需要在一个单独的线程中更新我的数据库......这将释放这个线程以继续动画?或者有没有办法告诉 WPF 在另一个线程上做它的东西?
  • 好的,所以您的数据库操作正在阻塞 WPF UI 线程。尝试使用 DispatcherTimer 而不是普通的 Timer。如果这没有帮助,请查看 WPF Dispatcher 以更新进度条。顺便说一句:避免使用 Thread.Sleep 这不是线程编程的好方法,大多数时候应该避免
  • 别担心,我一般不使用它,我只是想看看它是否在“当前”线程繁忙时仍然会动画。还有..我没有使用“计时器”我使用的是“双动画”

标签: c# .net wpf winforms elementhost


【解决方案1】:

有很多方法可以做到这一点,最简单的一种是使用后台工作者来完成冗长的任务。 Backgroundworker 有一个事件来报告进度。处理此事件并在处理程序中更改进度条的值。仅在主线程中制作动画同时仍在主线程上工作将无法正常工作...
您可能会尝试的另一种方法(尽管我不推荐用于健康应用程序)是实现 DoEvents 函数并在您希望进度条更新时在主线程中调用它......这是链接DoEvents 实现:
MSDN DoEvents sugestion
不过我强烈推荐第一种方法

【讨论】:

  • 您好,我不确定您是否针对我最初的问题阅读了我的最后两个 cmets ?我通过实现异步方法调用解决了这个问题。我知道将此信息报告回进度条的不同方式,我的问题是我没有意识到动画是在主 GUI 线程上运行的。一旦我知道了,我就能够实现我的解决方案。
【解决方案2】:

正如我在上面的评论中提到的,解决方案是在单独的线程中运行处理,这允许 .net 主 GUI 线程执行其工作,并为进度条设置动画。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多