从Windows Forms过渡到WPF

117

长期以来,我一直在进行Windows Forms开发(从VB6开始,一直持续到C# .NET 4.5),我已经基本达到了Windows Forms的极限,无论是使用纯.NET还是使用Native Code实现特效。

我尝试学习WPF和XAML,但是我在WPF的新设计者处卡住了。相比之下,它似乎非常难以使用,与Windows Forms设计者相比。

我想知道是否有任何替代.NET的WPF设计者,更适合Windows Forms开发人员使用?


7
通常我甚至都不使用设计师,只是为了检查整体布局是否符合我的预期;最后,我会手动编写所有的XAML代码,必要时会使用Blend——虽然我并不是一个设计师,所以这几乎从不发生。 - Patryk Ćwiek
你可以使用Expression Blend,但我认为这并不比较容易,它更适合设计师而非开发人员。我通常只是关闭预览并使用XML进行工作。 - BlackICE
5
使用其实并不难,只是你还不习惯。最大的难点在于这两种技术之间的范式转变。找一本好的XAML书籍,一旦你适应了XAML,你甚至不再需要使用设计师工具——你可以直接编写XAML。 - slugster
3
@slugster,我确实想知道那个。HTML也发生了同样的事情......我曾经用Dreamweaver构建用户界面,现在我手写HTML代码。 - Matthew Layton
5个回答

186

我喜欢写关于WPF初学者文章的博客,以下几篇文章可能会对您有所帮助:

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

换句话说,使用WPF时,您的应用程序由您创建的对象组成,您使用模板和其他UI对象告诉WPF如何绘制应用程序组件。

这与WinForms相反,您在WinForms中构建应用程序时,先添加 UI 对象,然后再为它们提供所需的数据。

因此,设计师并没有被广泛使用,因为应用程序组件是在代码中设计的,而设计师只需要绘制一个反映数据类(通常为ModelsViewModels)的用户友好界面。

个人而言,我更喜欢手动输入所有的XAML,因为这样更快,并且不会像拖放WPF设计器那样弄得一团糟,尽管偶尔我也会使用设计器预览UI外观。

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


15
完全同意@Rachel的观点。进入WPF的光明世界时,最重要的领悟是要理解UI不是数据,并相应地采取行动。 - Federico Berasategui
2
@Rachel - 只是为了扮演提出异议者的角色:从UI(窗口中显示哪些按钮,文本框等)开始有助于将应用程序集中在您想要做什么上。其余部分只是您想如何实现的实现细节。 - Asaf
3
请看这个链接:https://dev59.com/inNA5IYBdhLWcg3wYMx-。你会发现Winforms只是一个视图/UI组件,可以将业务对象绑定到用户控件上。虽然WPF更适合MVVM,但Winforms也可以使用这种设计模式。正如Rachel所说:“这与WinForms相反,你需要先构建UI组件,然后再提供它们所需的数据。” 这并不完全正确。我总是以至少数据和视图的方式进行思考:数据和Winforms/WPF/HTML等。 - Youp Bernoulli
3
@YoupTube 你是正确的,WinForms确实支持数据绑定,并且可以针对默认的绑定系统无法处理的情况创建自定义绑定。不过,我撰写这个答案和博客文章时是考虑到初学者的,通常初学者更多关注UI组件而不是数据对象。此外,WinForms中的绑定并不总是以现在的形式存在,所以许多已经习惯于WinForms或其他没有使用绑定技术的开发人员,在转换为绑定架构时往往不会识别这个关键区别。 :) - Rachel
2
@AshrafAbusada 我想这取决于你的WinForms应用程序是如何构建的,以及是否想要使用MVVM。我认为最大的两个挑战是那些没有以易于替换UI层的方式构建的WinForms应用程序,以及对象模型上缺少INotifyPropertyChanged。根据WinForms应用程序中模型层的复杂性,重写它们可能会更快。 - Rachel
显示剩余9条评论

9
虽然有些人不同意,但我建议不要使用VS设计器,至少不要用它来创建界面。如果您想在启动应用程序之前了解实现的第一印象,那么它是一个很好的查看器,只要没有使用像样式和模板这样的复杂东西。但是,在我看来,它的拖放结果只应用作原型,因此在不再需要时应将其丢弃。
以下是我不使用它的一些重要原因:
1. VS设计器使用固定边距和对齐方式(如果您使用布局控件,则通常不需要),这意味着如果要更改要求,则必须触及许多控件。如果您深入研究XAML和WPF机制,则可以创建一个外观和感觉可以轻松修改的应用程序。
2. 由于设计器正在生成XAML,因此构成不是最优化的,界面可能表现不佳。我没有测量过,这只是一种感觉。
一个更好的选择是 MS Blend,虽然开始并不容易。它的拖放结果比 VS 设计器的结果要好得多。
但这是一个非常强大的工具,可以帮助您使用非常强大的元素创建最先进的用户界面。我建议至少参加一个短期的工作坊,了解其机会。

回到你的问题,我个人认为,也有很多人同意,先找一本好书,比如 WPF Unleashed,然后,如果想了解更多细节,再看 WPF Pro。有很多功能与 Winforms 不同,您无法通过任何设计器来了解它们。我认为这是最好的方法。

请注意,有许多框架和库(例如MVVM lightWPFToolkit)已经解决了一些常见问题。因此,没有必要重新发明轮子。


9
我知道这是一个老问题,但为了那些正在查看此问题的人的利益,我认为我应该稍微纠正一下 - 从其他答案中读到一些东西,我感觉一些“不要使用设计师”的情绪来自于没有正确使用它。 这个教程很好地启动了你,并回答了其他帖子中的一些批评。
例如,您可以通过右键单击并选择“重置布局”从Winforms样式的基于边距的布局切换到更具WPF风格。 这个视频也涵盖了类似的内容。
总的来说,我仍然更喜欢VS2010设计师,在TabItems(我的当前项目经常使用)上拖放时,VS2013似乎有点buggy,但是VS2013文档大纲视图也可以让您在该视图中移动物体,这可能是真正的优势。
不过,要充分利用WPF和xaml,您需要相当熟练地使用设计师视图和xaml视图之间的切换。如果您回避设计师,则会错过可以帮助您的东西。
**编辑 - 尽管在VS 2013的Update 3和VS14的预览版中似乎已经改进了这一点,但到目前为止,我有时仍然会出现奇怪的行为。

8
我也经历过你这样的过程,之后我开始向公司里的每个人教授WPF,学到了一些重要的课程,这些课程对于所有使用WPF的人都非常有用。
  1. 如果在代码中使用UI控件...那么你做错了。完全没有必要在代码后台处理UI控件。
  2. 不需要视觉化开发工具进行单击操作。只需处理XAML就能提高生产力。使用复制/粘贴功能,不要依赖你的打字能力,这将避免许多麻烦。
  3. 把XAML看作一个查看数据的窗口。在代码后台更改数据,在XAML中定义UI如何解释数据。
  4. 转换器是很棒的工具。当你掌握了大量的转换器后,你的生产力会飞速提升。它们会取代大量的控件事件处理程序,隐藏或调整UI等功能。
这使得UI开发变得有趣。特别是一旦你发现它如何与异步进程配合使用时,它真的会减少Winforms带来的许多麻烦。

7

首先,在Visual Studio的WPF(XAML)设计器中,您应始终使用xaml代码构建UI,而不是拖放控件!您需要保持代码干净。您可以使用Expression Blend来帮助您,它更注重图形和拖放,但它是收费的。

这不是很难学习,但我认为您应该学会如何手写xaml,而不是寻找替代方案。


1
拖放并没有什么问题,但如果你更喜欢打字,那也没关系。手动输入从来不是 WPF 的关键。 - David
3
在WPF中进行拖放操作时,我经常看到许多-1200之类的边距值,这些值完全没有意义...我总是手动操作,这肯定更好。 - mlemay
1
这是离题了。确保你的问题是普遍存在的,而不仅仅是你自己的问题。此外,如果你遇到一些问题,就不能说拖放是不好的。依赖设计师仍然是必要的,有时也是受欢迎的。如果你知道表达式是如何被设计师和开发人员所欢迎的,你就会看到这一点是正确的。 - David
1
如果你使用Expression Blend,可以做到,但是我说的是在Visual Studio中... - mlemay
没有人将其限制在VisualStudio上,我们谈论的是WPF。 - David
12
我认为建议从Forms开始学习WPF的人不要使用设计师是一个非常糟糕的想法。理解XAML最快的方法是使用拖放功能,然后观察代码。 - Ucodia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接