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

你是什​​么WPF的

  • 发现最难理解
  • 或者被误解的时间最长

你到底是怎么理解的?(请提供链接等)。

(我正在问这个指导我学习WPF)

对不起,这太长了…希望这是有帮助的! 我要提到的一件事是,这些是绊倒我的概念/东西,我不确定如果我刚刚起步,是否将它用作要学习的项目清单。 我会潜入一些书籍 ,阅读很多博客( 乔希·史密斯 博士,WPF博士 ),一般来说,潜入并尝试一些小项目。

核心概念

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

    了解WPF中的不同树。 特别是理解逻辑树与可视化树,以及逻辑树中的元素如何通过数据模板,控制模板等扩展到可视化树中。

  • 依赖属性系统(链接: 1,2 )

    理解WPF中的整个依赖属性系统比第一眼看上去要大得多。 当然,创build一个快速的依赖属性很容易,然后使用它来授权其他的WPF概念,比如数据绑定和animation,然后开始。

    有正常的依赖性属性,然后有附加的依赖性属性。 有许多不同的方法可以将它们全部注册,并且可以设置一系列不同的元数据选项。

    了解为什么它被称为依赖属性,就此而言,花了我一些时间。 也就是说,理解财产的价值来自许多不同的来源(财产取决于这些价值提供者),并且在任何给定时间如何确定最终财产价值的顺序是优先顺序/algorithm。

  • 路由事件(链接: 1,2 )

    了解他们如何冒泡,路由或直接。 了解你也可以附加路由事件(而不是仅仅附加一个事件处理程序到已经路由到可视化树上的事件)。

    提示

    Adam Nathan的WPF Unleashed第3章是一个非常棒的章节,涵盖了这些重要的新概念,你应该阅读,在一个项目上工作,然后再读一遍。

    WPF博士的片段是学习依赖属性,路由事件和命令的好方法。

graphics概念 (链接: 1 )

  • 决议独立(链接: 1,2 )

    WPF带来了resultion独立性的所有好处(你用设备独立像素来指定所有东西),但是这也带来了一些你需要解决的问题。 最值得注意的是,通过利用像素捕捉,设置指南等,让图像看起来更加锐利。

  • 保留模式与立即模式

    WPF有一个保留的模式绘图子系统,这意味着它跟踪绘图指令并caching它们以备后用。 这可能是一个性能问题,如果你正在试图build立一个有很多的视觉效果,一次全部更新的东西。

  • 控件,元素,视觉(链接: 1 )

    理解WPF层次结构中的每一件事情,并理解它在性能上带来的重量。 特别是,你是否使用了一个Control,你可以重新模板化,重新设置等等,或者你需要一些超级光(比如在Visual层上编程),这样你就可以很快速地驱动它。

    提示

    Chris Sells和Ian Griffiths在其WPF编程书籍的后面有一个很好的附录,讲述了WPF API中的不同types,它们适用于层次结构,以及它们带来的价值。

WPF模式

  • Model-View-ViewModel(MVVM)模式(链接: 1 )

    MVVM模式已经被提到帮助一个人开始做WPF的方式。 我完全同意。 而不是用数据填充控件,而是开始将数据转换为可视化(通过数据模板)。

  • 附加属性行为模式(链接: 1,2,3 )

    WPF是可扩展的,就像没有其他的API。 利用附加的属性,你可以build立在一个非常优雅的方式,你认为你可能被卡住的额外的行为。

WPF!= Windows窗体

我知道有人已经提到这一点,但我想强调同意。 有这么多新的和不同的概念,你真的不得不从不同的angular度去解决一些问题和解决问题。 作为一个例子,Windows窗体是一个即时模式绘图子系统,而WPF是保留模式之一(上图)。

在WPF中做很多很多的事情

这是一个有趣的事情,但是因为在WPF中有很多方法可以做,所以它几乎是瘫痪的。 哪种方法是正确的做法? 这是吗? 是那个吗? 我不得不克服那种错误的方式,跳进去,从错误中学习。

WPF不是WinForms。 大部分(如果不是全部的话)用于在WinForms中完成任务的常用策略在WPF中是错误的(或最低效的)方法。 命令,依赖属性,绑定,模板等等,如果你采用WinForms的思维模式,这些都不会有用。

目前我们正在开发一个大型的可视化应用程序。 作为经验丰富的WinForms程序员,我们首先在多维数据的显示上进行了数千个视觉元素的预先计算。 滑块将使用callback来遍历视觉元素的维度。 没有数据将被加载超出初始设置。 这performance非常糟糕。

切换到数以千计的与数据转换器的绑定,只有几百个可视元素,数据在运行中加载和重新计算。 这导致了性能的提高。 几乎不可思议的是,成千上万的绑定会比数千个预先计算的视觉元素更快,但在WPF中就是这样。

“ 从WinForm到WPF:快速参考指南 ”可能是有用的。

我开始学习WPF时最难的一点是:

  • 样式和模板:我花了一段时间才明白什么时候使用哪个,以及它们如何相互交互
  • 复杂绑定与RelativeSource ,转换器…
  • 触发器:我仍然有时会对DataTriggerTriggerEventTrigger的使用感到困惑…
  • 依赖性属性和附加属性的机制
  • 路由事件的工作方式

如果您有使用Windows Forms的经验,那么起初有许多东西看起来很难。 你需要忘掉很多东西,并切换到一个非常不同的心智模式的UI结构。

起初,我开始编写代码,就像我在Windows窗体中做的那样,有很多代码隐藏,但这绝对不是正确的方法。 MVVM模式真的帮助我进入WPF“哲学”…

我学习WPF文档的主要来源当然是MSDN,如果你知道如何查找,你可以find大多数答案。 我还在以下博客上学到了很多东西:

  • Josh Smith在WPF上
  • JAPF
  • 莱斯特的WPF博客
  • C#门徒
  • 卡尔在WPF上

依赖属性花了一段时间。 这是一篇很好的文章 , 另 一篇文章帮助我理解这个新概念。

第二篇文章包含以下段落,真正澄清了我的几个问题。

依赖属性系统的一个关键值是构build属性的能力,每次属性值发生变化时都会自动通知任何注册的感兴趣方。 这种观察者模式的自由,无痛和自动实现非常强大,大大减轻了客户端程序员的负担(事实上,数据绑定系统依赖于它!)。

更一般地说,我还发现,以前的网页开发经验(特别是浏览器用户界面)对于“获取”WPF非常有用。 与仅使用Windows Forms或其他富客户端应用程序的人相比,它更适合您将其带入WPF的思维模式。

Web世界中一些更加明显的相似之处是CSS,stream布局,jQueryanimation,事件冒泡/路由以及适应广泛的浏览器和DHTML对象模型。

MMVM是一个相当棘手的事情学习。 不过,我认为它是关于WPF最好的事情之一。 需要进行大量的学习,因为它们有很多难以实现的场景。

正如托马斯指出的那样,乔希·史密斯等人有很多很棒的材料。 虽然WPF很容易学习,但是你必须用它来写一个应用程序来看看实际中的各种场景。

数据模板 (和控制模板)。

表面上,这是相当简单的,但是一旦你开始尝试在不同的XAML文件之间build立绑定,它可能变得非常混乱。

我想我最终通过阅读了许多MSDN文档,从而获得了一个体面的把握,而且还经历了尝试和错误。 玩弄东西通常是学习任何技术的最佳途径。

没有备忘录,我仍然不能在animation中指定目标属性:

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

从初学者的angular度来看吧。 我使用简单的编辑器,如KaXML或Sharpdevelop进行WPF开发。 我发现我无法进行数据库开发没有数据库网格组件。 所以它不像Windows窗体 。 开始search商业数据库网格组件。 在防守中人们会说这不是最难的事情或限制。

您必须使用.NET Framework支持的C#文件或其他语言文件来进行严重的应用程序开发。 如果这样做不成问题,为什么我需要在第一时间使用它。 我很高兴与C#为什么我需要使用WPF?

目前最困难的事情是:

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

最大的麻烦是:你不能让另一个开发人员工作WPF的应用程序完成。 WinForms和Asp.net的情况并非如此,任何人都可以使用很less的问题。 这是一个重大问题。

绑定语法的差异是一个; 即何时使用绑定和何时使用StaticResource / DynamicResource。 当我第一次学习WPF时,我一直把这两个混在一起。

起初,DP和附属性的不同forms也很难理解。

通读书籍和理解东西是一回事,在你的项目中应用它们是另一回事。 我在Outlook中创build了一个相对简单的联系人列表控件,并且遇到了许多小而明显的学习曲线。

  1. 首先,模板看起来很简单,但是当你玩这个游戏时,它会变得更加棘手。 当文本框变得焦点时,只需设置用户控件的背景颜色就具有挑战性。 原来,我不得不使用DataTrigger (谁会想到)。
  2. 使用一个包装作为ItemsPanel列表框突然成为一个挑战,因为它没有安排的项目(你必须玩它)。
  3. 绑定中的绝对RelativeSource

基本上能够绑定你的模板(从父母到孩子,反之亦然)的控制是一个很好的学习曲线。

我的build议。 写一个小应用程序,你会看到一起来的东西。