在学习WPF时,您发现最难理解的是什么

时间:2009-09-18 15:01:07

标签: .net wpf

你有多少WPF

  • 发现难以理解
  • 或被误解为最长的

最后你是如何理解的(请提供链接等)。

(我要求这是指导我学习WPF)

12 个答案:

答案 0 :(得分:93)

对不起,这太久了......希望它有用!我要提到的一件事是,这些是让我失望的概念/事物,我不确定如果你刚开始的话,我是否会将它作为列出的研究列表。我会深入了解一些books,阅读很多博客(Josh SmithDr. WPF),一般来说,潜入并在小项目中尝试一下。

核心概念

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

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

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

    了解WPF中的整个依赖属性系统比它最初看起来要大得多。当然,很容易创建一个快速依赖属性,然后使用它来授权其他WPF概念,如数据绑定和动画,但随后它开始。

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

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

  • 路由事件(链接:12

    了解它们如何冒泡,路由或直接。了解您还可以附加路由事件(而不是仅将事件处理程序附加到已路由可视树的事件)。

    <强>提示

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

    博士。 WPF的snippets是了解依赖项属性,路由事件和命令的好方法。

图形概念(链接:1

  • 解决方案独立性(链接:12

    WPF带来了resoultion独立性的所有好处(您可以使用设备独立像素指定所有内容),但这也会带来一些您需要解决的问题。最值得注意的是,当您希望它们利用像素捕捉,设置指南等时,让事情看起来更加清晰。

  • 保留模式与立即模式

    WPF有一个保留模式绘图子系统,这意味着它会跟踪绘图指令并将其缓存以供以后使用。如果您正在尝试构建具有大量视觉效果的内容,这可能会导致性能问题。

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

    了解WPF层次结构中的每个内容为您做什么,并了解它带来的性能。特别是,你是否使用了一个可以重新模仿,重新设计等等的控件......或者你需要一些超轻的控件(比如针对可视层进行编程),这样你就可以快速而快速地驱动它。

    <强>提示

    Chris Sells和Ian Griffiths在他们的编程WPF书背面有一个很好的附录,它讨论了WPF API中的不同类型,它们适合层次结构,以及它们带来了什么价值

WPF模式

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

    MVVM模式已被提及为帮助人们开始以WPF方式做事。我完全同意。您可以开始将数据转换为视觉效果(通过数据模板),而不是使用数据填充控件。

  • 附加财产行为模式(链接:123

    WPF可以像其他API一样可扩展。利用附加属性,您可以以非常优雅的方式构建其他行为,并且您认为可能会被卡住。

WPF!= Windows窗体

我知道有人已经提到这一点,但我想强调同意。有许多新的和不同的概念,你真的必须忘掉一些事情并从一个完全不同的角度解决问题。例如,Windows窗体是一个立即模式绘图子系统,而WPF是一个保留模式(上图)。

在WPF中做很多很多事情的方法

这是一个有趣的事情,但是因为有很多方法可以在WPF中做一些事情,所以它几乎瘫痪了。哪种方式是正确的做事方式?是这个吗?是那个吗?我不得不害怕以错误的方式去做,只是跳进去,从错误中吸取教训。

答案 1 :(得分:11)

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

目前我们正在开发一个大型可视化应用程序。作为经验丰富的WinForms程序员,我们在多维数据显示上的第一次削减预先计算了数千个视觉元素。滑块将使用回调遍历可视元素的尺寸。除初始设置外,不会加载任何数据。这表现非常差。

使用数据转换器切换到成千上万的绑定,只有几百个可视元素,数据被加载并重新计算。这导致性能提高了一个数量级。几乎不可想象的是,成千上万的绑定比数千个预先计算的可视元素更快,但WPF就是这种情况。

From WinForm to WPF: A Quick Reference Guide”可能有用。

答案 2 :(得分:10)

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

  • 样式和模板:我花了一段时间来了解何时使用它们以及它们如何相互作用
  • RelativeSource,转换器...
  • 的复杂绑定
  • 触发器:我有时会对使用DataTrigger s,Trigger s或EventTrigger s ...
  • 的位置感到困惑
  • 依赖属性和附加属性的机制
  • 路由事件的工作方式

如果您有使用Windows窗体的经验,有很多小事情一开始看起来很难。你需要忘掉很多东西,然后切换到一个非常不同的UI结构心理模型。

起初我开始编写代码,就像我在Windows窗体中编写的一样,有许多代码隐藏,但这绝对不是正确的方法。 The MVVM pattern真的帮助我进入了WPF“哲学”......

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

答案 3 :(得分:6)

依赖属性需要一段时间。这是一个nice articleand another帮助我了解这个新概念。

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

  

依赖关系的关键值   属性系统是能力   自动构建属性   通知任何已注册的相关方   每次财产的价值   变化。这是免费的,无痛的   自动执行   观察者模式是巨大的   强大而且大大减少了   客户端程序员的负担(在   事实上,数据绑定系统依赖于   在它!)。

更一般地说,我还发现以前的Web开发经验(特别是浏览器UI)在“获取”WPF时非常有用。与仅使用过Windows Forms或其他富客户端应用程序的人相比,它更多地是关于它允许您为WPF带来的心态。

来自网络世界的一些更明显的相似之处是CSS,流动布局,jQuery动画,事件冒泡/路由以及对广泛的浏览器和DHTML对象模型的熟悉。

答案 4 :(得分:3)

MMVM是一个非常棘手的事情。不过我觉得它是WPF最好的东西之一。需要进行大量的研究才能实现它,因为它们在很多场景中都很难实现。

托马斯指出,约什史密斯和其他人的作品有很多很棒的材料。虽然WPF非常容易学习,但要小心,但是你必须使用它来编写一个应用程序,以便在实践中查看各种场景。

答案 5 :(得分:1)

Data Templating(和控件模板)。

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

我想通过浏览大量的MSDN文档,我终于通过它获得了很好的掌握,而且,试验和错误。玩弄东西通常是学习任何技术的最佳方式。

答案 6 :(得分:1)

如果没有作弊表,我仍然无法在动画中指定目标属性:

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

答案 7 :(得分:1)

让我们从初学者的角度来看。我正在使用像KaXML或Sharpdevelop这样的简单编辑器来进行WPF开发。我发现没有数据库网格组件我就无法进行数据库开发。所以它不像Windows表单。开始搜索商业数据库网格组件。在辩护中,人们会说这不是最困难的事情或限制。

您需要使用.NET Framework支持的C#文件或其他语言文件来进行严肃的应用程序开发。如果这不是问题所以,为什么我需要在第一时间使用它。我对C#感到满意,为什么我需要使用WPF?

到目前为止最难的事情:

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

答案 8 :(得分:1)

答案 9 :(得分:1)

最大的麻烦是:你不能让另一个开发人员来处理由专业人士完成的WPF应用程序。 WinForms和Asp.net不是这种情况,任何人都可以解决很少的问题。这是一个重大问题。

答案 10 :(得分:0)

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

起初,不同形式的DP和附属物也很难理解。

答案 11 :(得分:0)

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

  1. 首先,当你正在阅读时,模板化似乎很简单但是当你玩它时会变得更加棘手。只需在文本框获得焦点时设置用户控件的背景颜色就具有挑战性。事实证明,我必须使用DataTrigger(谁会想到)。
  2. 使用包装作为列表框的ItemsPanel突然变成了挑战,因为它没有安排项目(你必须玩它)。
  3. Binding中肯定是RelativeSource
  4. 基本上能够绑定模板中的控件(从父级到子级,反之亦然)是一个很好的学习曲线。

    我的建议。写一个小应用程序,你会看到一起发生的事情。