c# - 更高效地将 WinForms 转换为 WPF 或将 WPF 转换为 Winforms

标签 c# wpf winforms

我是 GUI 开发的新手,我知道之前已经解决了 Winforms 和 WPF 之间的转换问题。然而,作为一个新手,我仍然不清楚最好的前进方向,我将非常感谢你的帮助。

我基本上有两个 SDK 示例代码,我正在尝试组合它们。一个示例代码是用 winforms 编写的,另一个是用 WPF 编写的。当我设想我的最终产品包括动画时,我相信我应该将 winforms 代码转换为 WPF(如果您不同意,请纠正我)。然而,它是一个复杂而冗长的代码,而且由于我对 winforms 相对更熟悉,我想知道我是否应该考虑将 WPF 转换为 winforms 并使用 Open GL 控件。最有效的前进方式是什么?从 winforms 示例代码中,我需要来自 DataGrid 和 WPF 的数据,我需要访问当前显示在 WindowsFormsHost 上的 512x512 实时图像。

非常感谢大家的帮助!!

最佳答案

I am new to GUI development

我必须警告您,WPF 的学习曲线非常陡峭。我什至会说它不适合没有经验的人。

converting between Winforms and WPF

问题不在于代码本身。问题在于写它的心态:

  • WPF 完全不需要所有“传统的”winforms 代码。

  • 在 WPF 中,有 DataBinding(好吧,实际上 winforms 有一个叫做数据绑定(bind)的东西,但与 WPF 相比,这是可笑的(与 winforms 中的其他任何东西一样)。这完全消除了创建的需要或者在过程代码中操作任何 UI 元素。一切都在 XAML 中定义,然后数据绑定(bind)到相关模型和 ViewModel。这就是为什么在这方面所需的心态存在巨大差异的原因。

    • 在 winforms 中,UI 存储有关其状态的信息。为了读取/检索/修改此信息,您必须在代码中访问这些 UI 元素。
    • 在 WPF 中,ViewModel 和 Model(您创建的用于存储数据的简单类,它们根本不绑定(bind)到 UI)存储此状态信息。为了读取/检索/修改此信息,您不要访问代码中的 UI 元素。

WPF 可视化树比 winforms X,Y 方法复杂得多。因此,获取一些深埋在其中的 UI 元素,假设一个 DataTemplate 用于一个 ItemsControl,它位于一个 DataTemplate 中,用作一个 CellTemplateDataGrid,这是您真的不想进入的东西。相信我。

我建议您阅读@Rachel 的 Excellent Explanation 和链接的博客文章,以更好地理解从笨拙、无聊、代码太多的 winforms 世界过渡到美丽、可定制、可扩展、令人愉快的 winforms 世界需要什么XAML 和 DataBinding(适用于所有基于 XAML 的技术 WPF、WinRT、Silverlight、Windows Phone 等)。

As I envisage my end-product to include animation

如果您即将开始(或开始)一个新产品,请忘记 winforms。它死了。除了默认的丑陋东西外,它不支持任何东西。如果不诉诸大量可怕的技巧,就无法对其进行自定义/动画化/美化。

每个人都会告诉你,winforms 只是用来维护遗留应用程序,但不再是任何开始任何严肃项目的人的选择。

However it a complex and lengthy code and as I am relatively more comfortable with winforms

一旦学习了 MVVM,您将很快意识到 WPF 需要 10% 的代码才能在 winforms 中执行任何操作。您复杂而冗长的代码(可能是代码隐藏)将被简化为 Simple、Simple properties 和 INotifyPropertyChanged 。这就是您在 WPF 中编码的方式。

关于c# - 更高效地将 WinForms 转换为 WPF 或将 WPF 转换为 Winforms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069009/

相关文章:

c# - short null 值为什么要转换成 int null 值来和 null 比较?

c# - WPF是否有鼠标滚轮上下滚动事件

wpf - 如何取消数据网格编辑

只能在具有另一个属性的类中的方法上的 C# 属性

c# - 如何使搜索栏随 Xamarin Android 的歌曲进度更新

c# - 为什么 Live connect 总是提示同意?

c# - LinkLabel 需要比 TextRenderer.MeasureText 更多的空间

c# - 更改用户控件上的光标

winforms - Winforms MDI 客户区的大小/位置

c# - 什么是解析?