C#GDI +和WPF之间的转换

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

人们可以推荐哪些资源可能会有所帮助吗? 或者任何可能有益的个人经历?

(我为这篇长篇文章提前道歉……我想传达的信息太多了……我希望它对你有所帮助。)

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

我同意Bijington的说法,从头开始让你的应用程序完全100%WPF是可行的…如果你可以说服那条路的权力。 但是,我们自己正在使用WPF互操作function就地转换我们的Windows窗体应用程序。 有一些限制,但总的来说它是一种有效的方法(而不是像我预期的那样令人沮丧)。

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

执行上述操作将使您了解您想要做的其他事情所需的内容。

我要警告你的一件事是WPF的学习曲线,特别是如果你来自Windows窗体背景……特别是如果你要构建自定义控件。 正如安倍提到的那样,这是一个完全不同的世界。 WPF肯定会带来很多function,但这种function是以学习如何使用它为代价的。 Abe提到了WPF中的自定义控件是如何“看起来”的,并且他们的“外观”可以通过ControlTemplate提供。 这只是WPF中提供用户界面的自定义部分的众多方法之一。

让我列举一些其他方法:

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

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

资源

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

  1. 图书
    • 由Chris Sells和Ian Griffiths编写WPF编程(特别是第18章)
    • Matthew MacDonald的Pro WPF(特别是第24章)
    • 亚当·内森释放的WPF(特别是第16章)
    • 应用程序= Charles Petzold的代码+标记(特别是第10,11和12章)
    • Chris Anderson的基本WPF(特别是第3章)

      我最喜欢的书是Charles Petzold的书和Adam Nathan的书。 然而,Sells&Griffiths的WPF编程的第18章对这个主题非常了解,特别是对问题的报道:我真的需要一个自定义控件吗?

  2. 论坛
    • WPF论坛
    • 堆栈溢出
      这里有两个post,你需要看一下( 一 , 二 )。
  3. MSDN
    我同意Bijington认为MSDN文档非常好。

  4. 博客
    在我在上面的论坛部分中引用的两篇StackOverflowpost中的一篇中,我指向我的“必读”列表中的一组博客。 特别是,我会特别指出Pavan Podila和Kevin Moore的博客。 Kevin Moore曾经是WPF控件的WPF程序管理器,他有一套很好的控件叫做WPF Bag-o-Tricks很有用,但更重要的是,你可以学习控件。

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

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

我个人发现msdn网站非常有用,如果不是stackoverflow是一个非常好的知识的地方。 如果您需要,我会很乐意给您指点。

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

另外值得注意的是,使用wpf而不是GDI,我们在性能方面取得了巨大的进步。

如何为WPF开发控件有一种范式转换。 您只需定义预期的行为,而不是定义所有行为并查找控件。

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

这也是WPF最强大的function之一; 在未来的任何时候,您的控件的消费者可以在不改变其行为的情况下改变其外观。 这样可以更轻松地控制您的控件。