25

我正在考虑将我的 c# 应用程序从使用自定义 GDI+ 绘制的控件迁移到具有自定义控件等的 WPF 应用程序。我想知道所涉及的内容和预期的内容。

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

4

3 回答 3

37

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

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

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

我建议您使用您的 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 的 Essential WPF(特别是第 3 章)

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

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

  5. 样品、样品和更多样品
    那里只有大量样品。几乎太多了!我将指向Family.Show(它是作为 WPF 的端到端参考示例创建的),我将指向WPF SDK 示例,特别是该部分中的控件自定义示例

于 2008-11-08T18:14:24.523 回答
3

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

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

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

于 2008-11-07T17:38:18.853 回答
2

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

就我个人而言,我发现msdn 网站 非常有用,如果不是 stackoverflow 也是一个非常好的知识场所。如果您需要任何指示,我很乐意提供指点。

此外,如果您对数据绑定有任何疑问,那么这里就是您要去的地方: bea costa 她已经涵盖了那里的大部分内容。

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

于 2008-11-07T14:31:33.663 回答