从 Windows 窗体过渡到 WPF

Posted

技术标签:

【中文标题】从 Windows 窗体过渡到 WPF【英文标题】:Transitioning from Windows Forms to WPF 【发布时间】:2013-03-28 12:05:18 【问题描述】:

很长一段时间以来,我一直坚持使用 Windows 窗体开发(从 VB6 开始,一直持续到 C# .NET 4.5),而且我几乎已经达到了 Windows 窗体可以做的极限,两者都使用纯 .NET,以及带有 Native Code 的特殊效果。

我曾尝试学习 WPF 和 XAML,但我被 WPF 的新设计师卡住了。与 Windows 窗体设计器相比,它确实似乎很难使用。

我想知道 .NET 的 WPF 设计器是否有任何替代方案,更适合 Windows 窗体开发人员?

【问题讨论】:

我通常不使用设计器,除了检查整体布局是否符合我的预期;最后,我在 XAML 中手动编写所有内容和/或在需要时使用 Blend - 尽管我不是设计师,所以几乎不会发生这种情况。 你可以使用 Expression blend,但我不认为这真的更容易,它更适合设计师而不是开发人员 IMO。我通常只是关闭预览并使用 xml。 不难用,就是不习惯。要克服的最大障碍是两种技术之间的范式转变。给自己买一本关于 XAML 的好书,一旦你习惯了 XAML,你甚至不会再使用设计器了——你会直接输入 XAML。 @slugster,我确实想知道这一点。 html 也发生了同样的事情……我以前用 Dreamweaver 构建 UI,现在我手动编写 HTML 代码 【参考方案1】:

我喜欢写有关 WPF 初学者文章的博客,其中有一些特别可以帮助您:

Understanding the change in mindset when switching from WinForms to WPF What is this "DataContext" you speak of? A Simple MVVM Example

总而言之,Winforms 和 WPF 之间的最大区别在于,在 WPF 中,您的数据层(DataContext)是您的应用程序,而在 Winforms 中,您的 UI 层是您的应用程序。

换个角度来看,使用 WPF,您的应用程序由您创建的对象组成,您使用模板和其他 UI 对象来告诉 WPF 如何绘制您的应用程序组件。

这与 WinForms 正好相反,您可以从 UI 对象构建应用程序,然后为它们提供所需的数据。

正因为如此,设计器实际上并没有太多使用,因为您的应用程序组件是用代码设计的,而设计器只需要绘制一个反映您的数据类的用户友好界面(通常是 Models 和 @ 987654330@)

就个人而言,我更喜欢手动输入我的所有 XAML,因为它更快,并且不会像拖放 WPF 设计器那样造成混乱,尽管我有时会使用设计器来预览我的UI 看起来像。

因此,对于您关于是否有其他 WPF 设计器适合 WinForms 开发人员的问题,我建议您不要寻找其他设计器,而是学习如何以应使用的方式使用 WPF。像 WinForms 一样使用 WPF 意味着您会错过很多让它如此出色的东西 :)

【讨论】:

完全同意@Rachel。了解 WPF 时最重要的认识是了解 UI is not Data 并采取相应的行动。 @Rachel - 只是扮演魔鬼的拥护者:从 UI 开始(哪些按钮、文本框等出现在窗口中)有助于将应用程序集中在 what 您想要做的事情上.剩下的只是你想如何的实现细节。 @HighCore 看看***.com/questions/982978/mvvm-for-winforms,您将不得不承认Winforms 只是一个视图/UI 组件,其中业务对象可以绑定到用户控件。好的:WPF 更适合 MVVM,但 Winforms 也可以在这样的设计模式中工作。正如 Rachel 所说,“这与 WinForms 是相反的,在 WinForms 中,您从 UI 对象构建应用程序,然后为它们提供所需的数据。”虽然这太不真实了。我总是以至少数据和视图的方式思考。数据和 Winforms / WPF / HTML 等等。 它至少在数据输入/修改级别支持数据绑定。我怀疑那些 99.9999999% 的开发人员也会在 WPF 中搞砸。但是让我们结束这个讨论。 WPF 绝对更强大/更适合 MVVM 和关注点分离,但我认为你和 Rachel 都将 Winforms 推到了一个负面的角落。尤其是当你继续使用你使用的词时...... @YoupTube 没错,Winforms 确实支持数据绑定,并且可以为默认绑定系统也无法工作的情况创建自己的自定义绑定。不过,我写这个答案和我的博客文章时考虑到了初学者,通常初学者会考虑 UI 组件,而不是数据对象。此外,WinForms 中的绑定并不总是以现在的状态存在,所以很多伴随 WinForms 长大的开发者,或者习惯了其他不使用绑定的技术的开发者,在切换时往往不会发现这个关键区别绑定架构。 :)【参考方案2】:

虽然有些人不同意,但我也建议不要使用 VS 设计器。至少不要创建接口。如果您可能想在不启动应用程序的情况下获得对实现的第一印象,那么它是一个很好的查看器,至少只要不使用像 StylesTemplates 这样复杂的东西。但是,恕我直言,它的拖放结果应该只用作原型,因此在不再需要后丢弃。

以下是我不使用它的一些重要原因。

    VS 设计器正在使用修复边距和对齐方式(如果您使用布局控件,这通常不是必需的),这意味着如果需求发生更改,您必须触摸许多控件。如果您深入了解 XAML 和 WPF 机制,您可以创建一个应用程序,在外观方面可以轻松修改。

    由于设计器正在生成 xaml,因此组合不是最佳的,并且 UI 可能表现不佳。我没量过,只是感觉。

MS Blend 是一个更好的选择,尽管一开始并不容易。它的拖放结果比 VS 设计器的结果要好得多。 但它是一个非常强大的工具,它可以帮助您使用非常强大的元素来创建最先进的 UI。我建议至少参观一个简短的研讨会,以了解其中的机会。

回到你的问题,恕我直言,我想很多人都同意,给自己买一本好书,例如WPF Unleashed 及更高版本,如果您想了解更多详情,WPF Pro。有很多与Winforms 不同的功能。您不会通过使用任何设计师来了解它们。我认为这是最好的方法。

还请考虑到有许多框架和库(例如MVVM light、WPFToolkit)已经解决了一些常见问题。所以没有必要重新发明***。

【讨论】:

【参考方案3】:

我知道这是一个老问题,但为了其他人的利益,我想我应该稍微调整一下平衡 - 阅读其他一些答案,我觉得有些“不使用设计师的情绪来自于没有正确使用它。 This tutorial 非常适合让您继续前进并回答其他帖子中的一些批评。

例如,您可以通过右键单击并选择“重置布局”从类似于 Winforms 的基于边距的布局(这是您拖放控件时的默认布局)切换到更 WPF 风格的样式

This video 涵盖了类似的领域。

总的来说,我仍然更喜欢 VS2010 设计器 - VS2013 在拖放到 TabItems ** 时似乎有点问题,(我当前的项目经常使用它) - 但是 VS2013 文档大纲视图可以让你在里面移动东西这种观点也是如此,这可能是一个真正的优势。

实际上,要充分利用 WPF 和 xaml,您需要相当流利地使用设计器视图和 xaml 视图并在它们之间切换;如果你回避设计师,你就会错过一些对你有很大帮助的东西。

** 编辑 - 虽然这似乎在 VS 2013 的更新 3 和 VS14 的预览版中得到了改进,但迄今为止我仍然有时会出现奇怪的行为。

【讨论】:

【参考方案4】:

首先,在 Visual Studio deisgner 的 WPF (XAML) 中,您应该始终使用 xaml 代码来构建您的 UI,而不是拖放您的控件!你需要保持你的代码干净。您可以使用 Expression Blend 来帮助您,它更适合拖放操作,但它不是免费的。

这不是一个很大的学习曲线,但我认为您应该学习如何手动执行 xaml,而不是寻找替代方法。

【讨论】:

Drag-n-drop 并没有什么坏处,但如果您喜欢打字,那也可以。手动输入绝不是 WPF 的关键。 当你在 WPF 中拖放时,我经常看到,你有很多 -1200 的边距,这样的事情根本没有意义......我一直这样做用手肯定会更好 这是题外话。确保您的问题对所有人来说都是司空见惯的,而不仅仅是您自己。此外,如果你有一些问题,你不能说拖放是不好的。仍然需要依赖设计师,有时也会受到青睐,如果您知道设计师和开发人员如何欢迎表达,您可能会发现这是真的。 是的,如果你使用表达式混合,你可以做到,但我在 Visual Studio 中说话...... 我认为建议来自 Forms 并启动 WPF 的人不要使用设计器是一个非常糟糕的主意。了解 XAML 的最快方法是使用拖放操作,然后观察代码。【参考方案5】:

我和你一样经历过这个过程。之后,我在公司 WPF 中教每个人。我学到了一些重要的经验教训,以及我认识的所有使用 WPF 的人。

    如果您在后面的代码中使用 UI 控件,...。那么您做错了。您绝对不需要在后面的代码中处理 UI 控件。 您不需要可视化开发人员来单击它。只处理 XAML 会提高工作效率。 使用复制/粘贴。不要相信你的打字能力。它会省去很多麻烦。 可以将 XAML 视为一个查看数据的窗口。在您背后的代码中,您正在更改数据。在 XAML 中,您定义 UI 将如何解释数据。 转换器非常棒。一旦您获得关键数量的转换器,您的工作效率就会飞涨。他们将接管大量隐藏或调整大小的控件事件处理程序的角色,或者关于 UI 的任何事情,

它使 UI 开发变得有趣。尤其是当您发现它喜欢与 Asyc 进程一起使用时。它确实消除了许多由 Winforms 引起的头痛。

【讨论】:

以上是关于从 Windows 窗体过渡到 WPF的主要内容,如果未能解决你的问题,请参考以下文章

wpfwindow.show字体不显示

将非WPF window设为 WPF Window的Owner

我是如何从Mac OS过渡到Windows?

Windows 窗体:从网站到 dataGridView 的 XML

将音频文件从 Windows 窗体应用程序资源复制到硬盘

[C#] 使用 NullLib.TickAnimation.Drawing 实现 WinForm 过渡动画