学习WPF时,你最难理解的是什么?

63

您在WPF中最难理解或最长时间误解的部分是什么?

  • 或者最难以理解的部分是什么?
  • 或者最长时间误解的部分是什么?

并且您最终是如何理解它的(请提供链接等)。

(我询问这个问题是为了指导我学习WPF)

12个回答

98

很抱歉,这篇文章有点长......但希望对您有所帮助!我想提醒的是,这些都是我在学习过程中遇到困难的概念/内容,如果你刚开始学习WPF不知道从哪里入手,我建议你可以阅读一些书籍、博客(如Josh SmithDr. WPF)并且反复试验小项目。

核心概念

  • 逻辑树和视觉树(链接:1

    了解WPF中不同的树结构,特别是逻辑树和视觉树之间的区别,以及逻辑树中的元素如何通过数据模板、控件模板等被扩展为视觉树中的元素。

  • 依赖属性系统(链接:12

    了解WPF中依赖属性系统的整个机制远比表面看起来要复杂得多。当然,很容易创建一个快速的依赖属性,并使用它来支持其他WPF概念,例如数据绑定和动画效果,但这只是开始。

    有常规的依赖属性,也有附加依赖属性。有许多不同的注册方式以及可以设置的各种元数据选项。

了解为什么它被称为依赖属性需要一些时间。也就是说,要理解属性的值来自许多不同的来源(该属性取决于这些值提供者),并且有一个优先级/算法顺序,用于设置任何给定时间的最终属性值。

  • 路由事件(链接:12

    了解它们如何进行冒泡、路由或直接传递。还要了解您也可以拥有附加路由事件(而不仅仅是将事件处理程序附加到已沿着可视树路由的事件)。

    提示

    Adam Nathan的《WPF Unleashed》第3章是一个覆盖这些重要新概念的精彩章节,您应该阅读、在项目上工作,然后再阅读一遍。

    Dr. WPF的片段是学习依赖属性、路由事件和命令的好方法。

  • 图形概念(链接:1

    • 分辨率独立性(链接:12

      WPF带来了所有分辨率独立性的好处(您使用设备无关像素指定所有内容),但这也带来了一些需要解决的问题。最值得注意的是,在您想要使事物看起来锐利的时候,通过利用像素捕捉、设置指南等方式解决。

    • 保留模式(Retained Mode)与直接模式(Immediate Mode)

      WPF有一个保留模式的绘图子系统,意味着它跟踪绘图指令并将其缓存以备后用。如果您尝试构建具有大量可视化元素且所有元素都在同时更新的内容,这可能会导致性能问题。

    • 控件(Controls),元素(Elements),可视化对象(Visuals)(链接:1)

      了解WPF层次结构中的每个组件为您提供了什么,以及它在性能方面带来的影响。特别是,您是否使用可重新模板化、可重新定制等控件...还是需要一些超轻量级的东西(比如编程对抗可视化层),以便您可以快速驱动它。

      提示

      Chris Sells和Ian Griffiths在他们的《Programming WPF》书的附录中谈到了WPF API中不同类型的组件,其在层次结构中的位置以及它们带来的价值。

    WPF模式

    • 模型-视图-视图模型(MVVM)模式(链接:1)

      MVVM模式已经被提及为帮助您开始以WPF方式进行操作。我非常同意。您不是将数据填充到控件中,而是通过数据模板将数据转换为可视化对象。

  • 附加属性行为模式(参考链接:123

    WPF 是一种非常可扩展的 API。利用附加属性,您可以非常优雅地构建附加行为,并在以前可能会卡住的地方增加额外的功能。

  • WPF ≠ Windows Forms

    我知道有人已经提到了这一点,但我要强调同意。因为 WPF 有很多新的和不同的概念,你确实必须要忘掉一些东西,并从完全不同的角度来解决问题。举个例子,Windows Forms 是一个立即模式的绘图子系统,而 WPF 是一个保留模式的绘图子系统(如上图)。

    WPF 中的许多方法

    这是一个有趣的话题,因为在 WPF 中有很多做事情的方法,几乎令人不知所措。哪种方法是正确的做法?是这个吗?还是那个?我必须克服害怕走错路的恐惧,勇敢尝试,并从错误中学习。


    11

    WPF不是WinForms。在WPF中,您用于完成WinForms任务的常见策略往往是错误的(或效率最低的)。命令、依赖属性、绑定、模板等在采用WinForms思维时将变得不太有用。

    目前我们正在开发一个大型可视化应用程序。作为经验丰富的WinForms程序员,我们首次尝试在预计算数千个可视元素的情况下显示多维数据。滑块会使用回调遍历可视元素的维度。除了初始设置外,不会加载任何数据。这种方法性能非常差。

    转而使用数据转换器进行数百个可视元素的数千个绑定,数据在运行时加载和重新计算。这导致性能提高了一个数量级。几乎无法想象数千个绑定比数千个预计算的可视元素更快,但WPF确实如此。

    "从WinForm到WPF:快速参考指南"可能会有所帮助。


    2
    似乎很明显,但改变思维方式却很难。+1。 - cplotts

    10

    我认为我开始学习WPF时最困难的点有:

    • 样式和模板:我花了一段时间才明白何时使用哪个,以及它们如何相互作用
    • 使用RelativeSource、转换器等进行复杂数据绑定
    • 触发器:我仍然有时会混淆在何处应该使用DataTriggerTriggerEventTrigger...
    • 依赖属性和附加属性的机制
    • 路由事件的工作方式

    如果你有Windows Forms的经验,那么许多小事情乍看起来可能很难。你需要忘掉很多东西,并切换到一个非常不同的UI结构的思维模式。

    起初我开始编写大量代码后台,就像在Windows Forms中一样,但那绝对不是正确的方式。MVVM设计模式真正帮助我进入WPF的“哲学”...

    我学习WPF的主要文档来源当然是MSDN,如果你知道如何查找,你可以找到大部分答案。我还从以下博客中学到了很多:


    你能否为每个项目添加你认为最有用的链接? - Ian Ringrose
    不是的,因为我没有找到每个项目的帮助都在一个地方... 不过我添加了一些有用的链接。 - Thomas Levesque

    6
    Dependency Properties需要一些时间来理解。这里有一篇好文章和另一篇文章帮助我理解这个新概念。
    第二篇文章包含了以下段落,真正澄清了我所拥有的一些问题。
    “Dependency Properties系统的一个关键价值是能够构建属性,每当属性的值发生变化时自动通知任何已注册的感兴趣的方。这种自由、无痛和自动实现观察者模式的方式非常强大,并且极大地减轻了客户端程序员的负担(事实上,数据绑定系统依赖于它!)。”
    更普遍地说,我还发现在Web开发(特别是浏览器UI)方面的先前经验对于“理解”WPF非常有用。这更多地涉及到它允许您为WPF带来的思维方式,与只使用Windows Forms或其他丰富客户端应用程序的人相比。
    从Web世界中更明显的类比有CSS,流式布局,jQuery动画,事件冒泡/路由以及熟悉广泛的浏览器和DHTML对象模型。

    依赖属性让你误以为它们很简单!哈。好答案。+1 - cplotts

    3

    MMVM是一个相当棘手的东西,需要花费很多时间去学习。然而,我认为它是WPF中最好的东西之一。由于在许多场景下实现起来有些困难,所以需要大量的学习。

    正如Thomas指出的那样,像Josh Smith等人发布了许多优秀的资料。但是要小心,虽然很容易学习WPF,但必须使用它编写应用程序才能看到各种场景的实践。


    1

    我仍然不能在动画中指定目标属性,而不使用作弊表:

    <DoubleAnimation
    Storyboard.TargetProperty=
    "(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" 
    To="1.2" Duration="0:0:.2" />
    

    即使有备忘单,我认为你搞错了 ;)(检查括号) - Thomas Levesque
    这就是我所说的 :) - alex
    是的,我不记得我在上面浪费了多少时间了... - Nicolas Dorier

    1

    在 WPF 中布局不同,请参阅 链接 以了解如何使用布局编辑器


    1

    最大的问题是:你不能让另一个开发人员来处理专业人员完成的WPF应用程序。这在WinForms和Asp.net中并非如此,任何人都可以很少遇到问题。这是一个重大问题。


    1

    数据模板(还有控件模板)。

    表面上,这相当简单,但一旦你开始尝试在不同的XAML文件之间设置绑定,它就会变得非常令人困惑。

    我想我最终通过研究大量的MSDN文档和试错来理解它。玩弄事物通常是学习任何技术的最佳方法。


    1

    让我们从初学者的角度来看待这个问题。我正在使用像KaXML或Sharpdevelop这样的简单编辑器进行WPF开发,但我发现如果没有数据库网格组件,我无法进行数据库开发,所以这与Windows表格不同。开始寻找商业数据库网格组件。而且辩护人会说这并不是最困难的事情或限制。

    对于严肃的应用程序开发,您必须使用由.NET Framework支持的C#文件或其他语言文件。如果这不成问题,为什么我需要首先使用它?我很满意C#,为什么我需要使用WPF?

    到目前为止,最困难的事情:

    1. 数据绑定,
    2. 依赖于另一种语言(例如C#),
    3. 图形能力。

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