【问题标题】:C# transition between GDI+ and WPFGDI+ 和 WPF 之间的 C# 转换
【发布时间】:2010-09-21 06:20:06
【问题描述】:

我正在考虑将我的 c# 应用程序从使用自定义 GDI+ 绘制的控件迁移到具有自定义控件等的 WPF 应用程序。我想知道其中涉及到什么以及会发生什么。

人们可以推荐任何可能有帮助的资源吗?或者确实有任何可能有益的个人经历?

【问题讨论】:

  • 我很想知道您是否决定跳入 WPF ......以及为什么或为什么不。如果你这样做了,在你做了一点点之后你的体验是什么。如果你把那个发回这里就太好了……只是一个想法。

标签: c# wpf gdi+


【解决方案1】:

(我提前为这篇长文道歉……我想表达的东西太多了……希望对你有所帮助。)

这就是我们现在正在做的事情(将大量使用自定义 (GDI+) 绘制控件的 Windows 窗体应用程序迁移到 WPF)。事实上,我在团队中的角色是构建这些 GDI+ 控件……现在是构建 WPF 控件。

我同意 Bijington 的观点,即从头开始让您的应用程序完全 100% WPF 是要走的路……如果您能说服当权者走这条路的话。但是,我们自己正在就地转换我们的 Windows 窗体应用程序,利用 WPF interop 功能。有一些限制,但总体而言,这是一种有效的方法(并且没有我预期的那么令人沮丧)。

我的建议是,您可以使用其中一个 GDI+ 控件并在 WPF 中构建相同的控件。然后,当您完成后,将其扔掉,然后再做一次。在第一次努力中,您总是会学到一些东西……并发现有更好的方法来代替。我会从一些小事开始……自定义按钮是一个不错的起点。

执行上述操作将使您了解您想做的所有其他事情都需要什么。

我要警告您的一件事是 WPF 的学习曲线,特别是如果您来自 Windows 窗体背景......尤其是如果您要构建自定义外观控件。正如安倍所说,这是一个完全不同的世界。 WPF 确实带来了很大的力量,但这种力量是以学习如何使用它为代价的。 Abe 提到 WPF 中的自定义控件是如何“无外观”的,并且它们的“外观”可以通过 ControlTemplate 提供。这只是 WPF 中提供自定义外观的用户界面的众多方法之一。

让我列举一些额外的方法:

  1. 使用 WPF 的样式功能设置现有控件的样式。
  2. 利用 WPF 的内容模型和/或从 ContentControl 派生的控件。这允许您将任意外观的“内容”粘贴到控件的视觉效果中(例如,可能将自定义绘制的形状粘贴到按钮的中间)。
  3. 利用 UserControl 从其他控件/元素组成一个控件。
  4. 从 WPF 中的现有控件/类派生,扩展其行为并提供一组不同的默认视觉效果。
  5. 从 FrameworkElement 派生,通过覆盖部分或全部 MeasureOverride、ArrangeOverride 和 OnRender 方法创建自定义 WPF 元素。
  6. 还有更多......如果你相信的话。

在 Windows 窗体中,就像他们给了您一把锤子 (UserControl) 和一把螺丝刀 (Control)。但是,在 WPF 中……他们为您提供了包含所有 100 种工具的整个工具箱。这是学习曲线大于正常的部分原因。但是,现在您可以使用以前从未有过的锯子来锯掉 2x4 的末端,而不是使用锤子和/或螺丝刀来尝试做同样的事情。

资源

(好消息是有很多资源可以帮助你。)

  1. 书籍
    • Chris Sells 和 Ian Griffiths 编写的 WPF 编程(特别是第 18 章)
    • Matthew MacDonald 的 Pro WPF(特别是第 24 章)
    • 由 Adam Nathan 发布的 WPF(特别是第 16 章)
    • 应用程序 = 代码 + Charles Petzold 的标记(特别是第 10、11 和 12 章)
    • Chris Anderson 的基本 WPF(特别是第 3 章)

      我最喜欢的书是 Charles Petzold 的书和 Adam Nathan 的书。但是,Sells & Griffiths 编写的 Programming WPF 第 18 章确实很好地概述了该主题,特别是涵盖了以下问题:我真的需要自定义控件吗?
  2. 论坛
    • WPF Forum
    • 堆栈溢出
      这里有两篇特别值得一看的帖子(onetwo)。
  3. MSDN
    我同意 Bijington 的观点,即 MSDN documentation 非常棒。

  4. 博客
    在我在上面论坛部分引用的两篇 StackOverflow 帖子中的 one 中,我指出了我的“必读”列表中的一组博客。特别要特别指出Pavan PodilaKevin Moore的博客。 Kevin Moore 曾经是 WPF 控件的 WPF 程序经理,他有一组很好的控件,称为 WPF Bag-o-Tricks,这些控件非常有用,但更重要的是,您可以从中学习。

  5. 样品、样品和更多样品
    那里只有大量的样品。几乎太多了!我会指向Family.Show(它是作为WPF 的端到端参考示例创建的),我会指向WPF SDK samples,尤其是该部分中的Control Customization samples

    李>

【讨论】:

  • 不错的答案。很多细节。我即将开始一个类似的项目,所以这非常有用。 +1 cplotts。
  • 谢谢,感谢您的称赞。我已经感受到将我的 Windows 窗体思维方式转变为 WPF 思维方式的痛苦……并希望帮助其他人尽可能地避免这种情况。
  • And then, when you are finished, throw it away and do it again - 我很久以前在Basic中这样做过,但现在绝对不会了......我建议你不要把它扔掉; C# + VS 对清理非常友好。而是把它清理干净。根据我的经验,这需要的时间要少得多。
【解决方案2】:

开发 WPF 控件的方式发生了范式转变。您只需定义预期的行为,而不是定义所有行为并查找控件。

这是迁移到 WPF 的最困难的方面。您的控件类定义了行为协定,并公开了将用于呈现的属性,并且 ControlTemplate 用于定义控件的外观。

这也是WPF最强大的功能之一;在未来的任何时候,您的控件的使用者可以在不改变其行为方式的情况下改变它的外观。这样可以更轻松地对控件进行主题化。

【讨论】:

    【解决方案3】:

    这实际上是我目前正在进行的一个项目,尽管我很幸运能够重新开始。如果你能做到这一点,我强烈推荐它,显然保留旧系统/控件的核心功能,但重新开始。从一个基础开始并知道以前哪里出错/正确总是很好。

    我个人发现msdn website 非常有用,如果不是,stackoverflow 是一个非常好的知识场所。如有需要,我很乐意提供指点。

    此外,如果您对数据绑定有任何疑问,请访问: bea costa 她已经涵盖了那里的大部分内容。

    另外需要注意的是,使用 wpf 而不是 GDI,我们体验到了性能的巨大改进。

    【讨论】:

    • 感谢您的回复。我考虑这一点的原因之一是考虑潜在的性能提升。目前我完全没有 WPF 的背景,所以这让我有点担心。有什么好的“初学者指南”可以推荐吗?
    • WPF 中的保留模式组合系统确实带来了一些引人注目的性能优势......在大多数情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多