从Windows窗体过渡到WPF


113

很长一段时间以来,我一直坚持从事Windows Forms开发(从VB6开始,一直持续到C#.NET 4.5),并且我几乎都达到了Windows Forms可以使用纯.NET的极限。 ,以及使用本机代码的特殊效果。

我曾尝试学习WPF和XAML,但是我对WPF的新设计师一无所知。与Windows Forms设计器相比,它似乎真的很难使用。

我想知道.NET的WPF设计器是否还有其他更适合Windows Forms开发人员的替代方法?


7
我通常甚至不使用设计器,只是检查整体布局是否符合我的期望。最后,我用XAML手工编写了所有内容,并且/或者在需要时使用Blend-尽管我不是设计师,所以几乎没有发生过。
PatrykĆwiek13年

您可以使用Expression blend,但是我认为这真的没有那么容易,对于设计师而言,它比开发人员IMO还要更多。我通常只是关闭预览并使用xml。
BlackICE

5
使用起来并不难,您根本就不习惯。要克服的最大障碍是两种技术之间的范式转换。给自己上一本有关XAML的好书,一旦您习惯了XAML,您甚至将不再使用设计器-您将直接输入XAML。
slugster

3
@slugster,我确实对此感到疑惑。HTML也发生了同样的事情...我曾经使用Dreamweaver构建UI,现在我手动编写HTML代码
Matthew Layton 2013年

Answers:


175

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

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

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

这与WinForms相反,在WinForms中,您可以使用UI对象构建应用程序,然后向其提供所需的数据。

因此,由于您的应用程序组件是通过代码设计的,因此实际上设计师并没有那么多的用途,并且只需要设计师绘制一个用户友好的界面即可反映您的数据类(通常是ModelsViewModels

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

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


14
完全同意@Rachel。了解WPF时,最重要的认识是要了解UI并非Data并采取相应的行动。
Federico Berasategui

2
@Rachel -只是唱唱反调:与UI开始(这按钮,文本框等出现在窗口)有助于专注于应用程序是什么,你想做的事情。剩下的只是您要如何实现的实现细节。
Asaf 2013年

3
@HighCore看一下stackoverflow.com/questions/982978/mvvm-for-winforms,您将不得不承认Winforms只是一个View / UI组件,可以在其中将业务对象绑定到用户控件。好的:WPF更适合MVVM,但是Winforms也可以在这种设计模式下工作。正如Rachel所言:“这与WinForms相反,在WinForms中,您是使用UI对象构建应用程序,然后向其提供所需数据的。” 虽然如此,但事实并非如此。我一直以至少数据和视图的方式思考。数据和Winforms / WPF / HTML等。
Bernoulli IT

2
它至少在数据输入/修改级别上确实支持数据绑定。我怀疑那些99.9999999%的开发人员也将使用WPF。但是,让我们结束这一讨论。WPF绝对更强大/适用于MVVM和关注点分离,但我想您和Rachel都将Winforms推向了不利的境地。尤其是当您继续使用所用的单词时……
Bernoulli IT

3
@YoupTube是的,Winforms支持数据绑定,并且对于默认绑定系统也无法使用的情况,可以创建自己的自定义绑定。我写这个答案和博客文章时都考虑到了初学者,并且通常初学者考虑的是UI组件,而不是数据对象。此外,WinForms中的绑定并不总是像现在这样存在,所以许多与WinForms一起成长的开发人员,或者习惯于其他不使用绑定的技术的开发人员,在切换时通常不会识别出这一主要区别。绑定的架构。:)
Rachel

9

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

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

  1. VS设计器正在使用固定边距和对齐方式(如果使用布局控件,通常不需要这样做),这意味着如果需求发生变化,则必须触摸许多控件。如果您精通XAML和WPF机制,则可以创建一个外观和感觉都可以轻松修改的应用程序。

  2. 由于设计人员正在生成xaml,因此合成效果不是最佳的,UI可能会表现不佳。我没有测量,只是一种感觉。

更好的替代方法是MS Blend,尽管起步很简单。它的拖放结果比VS设计器的结果好得多。
但这是一个非常强大的工具,它可以帮助您使用非常强大的元素来创建最先进的UI。我建议至少参观一个简短的研讨会,以了解其机会。

回到你的问题,恕我直言,我认为很多人都同意,让自己一本好书,例如WPF偷跑及更高版本,如果你想了解更多有关的细节,WPF临。与相比,有很多功能Winforms。您将不会通过使用任何设计师来了解它们。我认为这是最好的方法。

还请考虑那里有许多框架和库(例如MVVM lightWPFToolkit),它们已经在解决一些常见问题。因此,没有必要重新发明轮子。


9

我知道这是一个古老的问题,但是为了其他人的利益,我认为我应该稍微纠正一下这种平衡-阅读其他一些答案,我会感到有些“不使用设计器”情绪来自于使用不当。 本教程非常适合您,并回答了其他帖子中的一些批评。

例如,您可以从拖放控件时默认使用的基于Winforms的基于边距的布局切换到更加WPF风格的样式,方法是右键单击并选择“重置布局”

该视频涵盖了类似的背景。

我仍然更喜欢VS2010设计器-拖放到TabItems **时,VS2013似乎有点bug(我的当前项目使用了很多东西)-但是VS2013 Document Outline视图也允许您在该视图中移动内容,这可能是真正的加分。

但是,实际上,要充分利用WPF和xaml,您需要在设计者视图和xaml视图上都相当流利,并且需要在它们之间进行切换。如果您避开设计师,就会错过一些可以为您带来很多帮助的东西。

**编辑-尽管在VS 2013的Update 3和VS14的预览中似乎已对此进行了改进,但到目前为止,我有时仍会出现奇怪的行为。


7

首先,在Visual Studio deisgner的WPF(XAML)中,您应始终使用xaml代码来构建UI,并且不要拖放控件!您需要保持代码干净。您可以使用Expression Blend来帮助您,通过拖放使其更加面向图形,但这不是免费的。

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


1
拖放操作没有害处,尽管如果您喜欢打字,那也没关系。手动键入绝不是WPF的关键。
David

3
当您将在WPF下降,我看的时候,你有很多的保证金-1200和类似的东西,它不是在所有意义的......我一直用手工做的是更好的肯定
mlemay

1
这是题外话。确保您的问题对所有人而言都是普遍现象,而不仅仅是您自己。此外,如果遇到问题,您不能说拖放是不好的。如果仍然知道设计师和开发人员都欢迎表达,那么仍然需要依靠设计师,有时甚至依靠设计师,您可能会发现这是事实。
David

1
是的,如果您使用表情混合,那么您可以做到,但是我在Visual Studio中聊天……
mlemay

12
我认为建议来自Forms的人并启动WPF不使用设计器是一个非常糟糕的主意。理解XAML的最快方法是使用拖放,然后观察代码。
Ucodia

7

我像您一样经历了这个过程。之后,我在公司WPF中教所有人。我已经学到了两个重要的课程,并且我认识的每个与WPF一起工作的人。

  1. 如果您在后面的代码中使用UI控件,则....那么您做错了。绝对不需要您在后面的代码中处理UI控件。
  2. 您不需要视觉开发人员即可单击它。仅处理XAML,您的工作效率就会大大提高。使用复制/粘贴。不要相信您的打字能力。这将节省很多麻烦。
  3. 可以将XAML看作是查看数据的窗口。在后面的代码中,您正在更改数据。在XAML中,您正在定义UI如何解释数据。
  4. 转换器很棒。一旦获得关键数量的Converters,您的生产力就会迅速提高。他们将承担大量隐藏或调整大小的控件事件处理程序的角色,或者负责UI的操作,

它使UI开发变得有趣。尤其是一旦您发现与Asyc流程一起玩的感觉如何。它确实消除了Winforms造成的许多麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.