【问题标题】:WinForms to WPF - How do we get there from here?WinForms 到 WPF - 我们如何从这里到达那里?
【发布时间】:2011-03-28 07:56:44
【问题描述】:

有没有一种实用的方法让我们慢慢地将 WinForms 应用程序演进到 WPF,而不会为我们自己制造奇怪的互操作场景的支持噩梦?

背景信息:

我们有一个大型战舰灰色 WinForms 应用程序,被大约 60-75 个用户的内部组大量使用。我们开始遇到一些地方,我们可以从 WPF 中的应用程序中看到一些好处,但这还不足以证明一个大型项目完全重写它是合理的。应用程序中的所有屏幕都是独立的 WinForms 用户控件,而 WinForms 应用程序只是一个外壳,用于处理菜单、打开/关闭表单、提供一些共享帮助方法等...

到目前为止,我们的最佳想法是将 shell 应用程序转换为 WPF,然后在其中托管 WinForms 用户控件。我们认为,随着时间的推移,我们可以转换用户控件,将这些更改与具有足够业务价值以支持额外工作的计划联系起来。我担心互操作的效果如何以及它将如何影响性能。我还担心我们如何过渡到应用程序的新外观。让 shell 应用看起来很时髦,然后在其中托管旧的战舰灰色用户控件似乎很奇怪,在 WPF 中创建 shell 应用并让它看起来就像在 WinForms 中一样似乎也很奇怪。

如果 Caliburn、Prism 或其他类似框架之一可以简化过渡,我们也愿意探索这些选项。

【问题讨论】:

    标签: .net wpf winforms client-server winforms-interop


    【解决方案1】:

    我们处于类似情况并选择了以下路径:一开始,我们开始在应用程序外壳中托管几个 WPF 窗口(仍然是 WinForms)。当然有一些明显的差异,但我们故意通过淡化新窗口来减少差异。我们认为,当我们转换剩余的窗口/控件时,将更容易“升级”为更生动的体验,因为 UI 将完全是 WPF,我们可以让图形设计师基于 XAML 发挥他们的魔力。

    我们现在已经达到了大多数窗口都是 WPF 的地步。我们已经开始将 WinForms shell 应用程序转换为基于 WPF 的 shell 应用程序来托管剩余的 WinForms。我们仍然有一些暗淡的颜色,但用户已经开始注意到差异,虽然它很小,但我们的用户仍然喜欢渐进的积极变化。不会太久,我们将淘汰最后一个 WinForm。这将是我们让我们的图形设计师摆脱束缚的关键!

    至于性能:我当然不能做出笼统的陈述,因为它在很大程度上取决于您的特定控件/窗口。在我们的产品(数百个窗口)中,我们没有发现任何与 WPF 和 WinForms 混合相关的重大性能问题。

    我们没有研究任何框架,所以恐怕我无法评论这些。

    【讨论】:

    • +1 这很好地描述了我自己的经历。此外,这里有一个有趣的 PDC 会议,介绍了如何使用 NET Framework 4 互操作实现 Visual Studio 2010:microsoftpdc.com/2009/CL09
    • 我不确定是否有一个“正确”的答案,但我认为这是我们最有可能最终采用的方法。
    • 在所有这些由企业支付的努力中,您是否为最终用户提供了任何新的有用功能,或者您只是玩得开心?
    • @smirkingman 有时您无法将所有东西都放入垃圾箱并从头开始。同样,如果您需要运送产品,您也不能长时间保持安静。那么您可能会在很长一段时间内使用这种混合解决方案。价值是:您仍然有可以出售的运输产品。客户知道产品正在采用新技术。即使功能保持相似,价值也可以以许多不同的形式出现,例如保护现有投资。我很想一口气改变一切。但也有商业现实。
    【解决方案2】:

    很好的问题,目前 WPF 中的大部分工作都涉及将旧的 WinForms 应用程序转换为 WPF。根据我的经验,最好的情况是根据旧的应用程序/需求从头开始构建应用程序。幸运的是,我参与了一个项目,我们从头开始重新编写应用程序,我确信将两者混合所需的时间/投资更少。

    我个人认为,如果我们尝试将两者混合使用会造成混乱。另一点是,很难有效地设计混合应用程序。

    在我当前的项目中(这是一个从过去 10 年开始运行的大型项目),我们正在逐个模块地转换应用程序模块。对我们来说幸运的是,我们的应用程序由各种较小的应用程序组成,因此将它们一一转换更容易。在您的情况下,我会说您确定可以完全转换为 WPF 的区域并开始在 WPF 中构建它们,如此处所建议 -

    Windows 窗体 – WPF 互操作性常见问题解答: http://windowsclient.net/learn/integration.aspx

    我还建议使用一些工具将 windows 窗体转换为 XAML(WPF);这肯定会帮助您节省一些时间。

    Windows 窗体到 WPF 转换器: http://wf2wpf.codeplex.com/

    Windows 窗体到 XAML 转换器: http://www.ingeniumsoft.com/Products/WinForm2XAML/tabid/63/language/en-US/Default.aspx

    Windows 窗体到 Windows 演示文稿 基础转换器: http://www.spiderwan.com/spiderwan/ConvertWinFormToWPF/WinFormToWPF.aspx

    【讨论】:

    • 我通常更喜欢 John 描述的增量转换方法,但我同意有时从原始需求重写是有意义的。然而,我强烈反对 Paul G 关注 Windows 窗体到 WPF 转换工具:那些使用这些工具的人总是最终得到一个比 Winforms 应用程序更难维护的应用程序。如果处理得当,WPF 应用程序比等效的 Winform 更简单、更易于维护。花费在创建高质量视图模型和 XAML 上的时间将获得十倍的回报,尤其是在进行重写时。
    • 重点是,自己设计视图模型和 XAML 总是会更好。我只是想让保罗知道可用的选项(显然是为了节省时间)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2014-10-01
    • 2020-12-02
    • 2010-09-28
    相关资源
    最近更新 更多