【发布时间】:2009-09-18 15:01:06
【问题描述】:
你做了什么 WPF
- 发现最难理解
- 或被误解为最长的
和你最后是怎么理解的(请提供链接等)。
(我要求这个来指导我学习 WPF)
【问题讨论】:
你做了什么 WPF
和你最后是怎么理解的(请提供链接等)。
(我要求这个来指导我学习 WPF)
【问题讨论】:
抱歉,拖了这么久……希望对您有所帮助!我要提到的一件事是,这些是让我感到困惑的概念/事物,如果您刚刚开始,我不确定是否会将其用作要学习的内容的逐项列表。我会潜入一些books,阅读很多博客(Josh Smith,Dr. WPF),一般来说,潜入并尝试一些小项目。
核心概念
逻辑树和视觉树(链接:1)
了解 WPF 中的不同树。尤其是了解逻辑树与可视化树,以及逻辑树中的元素如何通过数据模板、控制模板等方式扩展到可视化树。
了解 WPF 中的整个依赖属性系统比最初看起来要复杂得多。当然,创建快速依赖属性并使用它来支持其他 WPF 概念(如数据绑定和动画)很容易,但随后就开始了。
有正常的依赖属性,然后有附加的依赖属性。有很多不同的方法可以全部注册它们,还有很多不同的元数据选项可供您设置。
理解为什么它被称为依赖属性,就此而言,我花了一些时间。也就是说,了解属性的值来自许多不同的来源(属性取决于这些值提供者),并且在任何给定时间如何设置最终属性值都有优先级/算法顺序。
了解它们如何冒泡、路由或直接。了解您还可以附加路由事件(而不是仅将事件处理程序附加到已路由到可视树的事件)。
提示
Adam Nathan 的WPF Unleashed 中的第 3 章是一个很棒的章节,涵盖了这些重要的新概念,您应该阅读、处理项目并再次阅读。
博士。 WPF 的snippets 是了解依赖属性、路由事件和命令的好方法。
图形概念(链接:1)
WPF 带来了分辨率独立性的所有好处(您可以使用设备独立像素指定所有内容),但这也带来了一些您需要解决的问题。最值得注意的是,通过利用像素捕捉、设置指南等,让您希望它们看起来清晰。
保留模式与立即模式
WPF 有一个保留模式绘图子系统,这意味着它会跟踪绘图指令并缓存它们以供以后使用。如果您尝试构建具有大量同时更新的视觉效果的东西,这可能是一个性能问题。
控件、元素、视觉效果(链接:1)
了解 WPF 层次结构中的每一件事对您的作用,并了解它对性能的影响。特别是,您是否使用可以重新模板、重新设置样式等的控件……或者您是否需要一些超轻量级的东西(例如针对可视层进行编程),以便您可以快速地驱动它。
提示
Chris Sells 和 Ian Griffiths 在他们的Programming WPF 书后面有一个很棒的附录,其中讨论了 WPF API 中的不同类型、它们在层次结构中的位置以及它们带来的价值.
WPF 模式
模型-视图-视图模型 (MVVM) 模式(链接:1)
已经提到 MVVM 模式可以帮助人们开始以 WPF 方式做事。我不能同意更多。您开始将数据转换为视觉效果(通过数据模板),而不是用数据填充控件。
WPF 像其他 API 一样可扩展。利用附加属性,您可以以非常优雅的方式在您认为可能被卡住的地方构建额外的行为。
WPF != Windows 窗体
我知道有人已经提到了这一点,但我想强调同意。有这么多新的和不同的概念,你真的必须忘掉很多东西,从完全不同的角度解决问题。例如,Windows 窗体是即时模式绘图子系统,而 WPF 是保留模式(上图)。
在 WPF 中做事的许多方法
这是一件很有趣的事情,但是因为在 WPF 中有很多方法可以做某事,所以它几乎是瘫痪的。哪种方式是正确的做事方式?是这个吗?是那个吗?我不得不克服对做错方式的恐惧,只是跳进去,从我的错误中吸取教训。
【讨论】:
WPF 不是 WinForms。 您在 WinForms 中用于完成任务的大多数(如果不是全部)常用策略在 WPF 中都是错误的(或效率最低的)方式。如果您采用 WinForms 思维方式,命令、依赖属性、绑定、模板等都将不太有用。
目前我们正在开发一个大型可视化应用程序。作为经验丰富的 WinForms 程序员,我们在显示多维数据时首先预计算了数千个可视元素。滑块将使用回调遍历视觉元素的维度。除了初始设置之外,不会加载任何数据。这性能很差。
使用数据转换器切换到数以千计的绑定,仅在几百个可视元素上,数据被即时加载和重新计算。这导致性能提高了一个数量级。数以千计的绑定比数以千计的预计算视觉元素更快,这几乎是不可想象的,但在 WPF 中就是这种情况。
【讨论】:
当我开始学习 WPF 时,我想说的是:
RelativeSource、转换器的复杂绑定...DataTriggers、Triggers 或 EventTriggers 感到困惑...如果您有使用 Windows 窗体的经验,有很多小事一开始可能看起来很困难。你需要忘掉很多东西,并切换到一个非常不同的 UI 结构心智模型。
起初我开始像在 Windows 窗体中一样编写代码,有很多代码隐藏,但这绝对不是正确的方式。 The MVVM pattern 真的帮助我进入了 WPF “哲学”...
我学习 WPF 的主要文档来源当然是 MSDN,如果您知道如何查找,则可以在其中找到大多数答案。我还在以下博客上学到了很多东西:
【讨论】:
依赖属性需要一段时间。这是一个nice article、and another,它帮助我实现了这个新概念。
第二篇文章包含以下段落,真正澄清了我的一些问题。
Dependency 的键值 属性系统是能够 自动构建属性 通知任何注册的利益相关方 每次财产的价值 变化。这种免费、无痛且 自动执行 观察者模式非常 功能强大,大大降低了 客户端程序员的负担(在 事实上,数据绑定系统取决于 就可以了!)。
更一般地说,我还发现以前的 Web 开发经验(尤其是浏览器 UI)对于“获取”WPF 非常有用。与只使用过 Windows 窗体或其他富客户端应用程序的人相比,它更多地在于它允许您将思维方式带到 WPF 中。
Web 世界中一些更明显的相似之处是 CSS、流动布局、jQuery 动画、事件冒泡/路由以及对广泛的浏览器和 DHTML 对象模型感到满意。
【讨论】:
MMVM 是一个非常难学的东西。但是我认为它是关于 WPF 的最好的事情之一。需要大量研究才能将其纳入其中,因为它们有很多难以实施的场景。
正如 Thomas 指出的那样,Josh Smith 和其他人提供了很多很棒的材料。请注意,虽然 WPF 很容易学习,但您必须使用它,例如编写应用程序来查看实践中的各种场景。
【讨论】:
Data Templating(以及控制模板)。
从表面上看,它相当简单,但是一旦您开始尝试设置不同 XAML 文件之间的绑定,它就会变得非常混乱。
我想我最终通过阅读大量 MSDN 文档(但此外,反复试验)成功地掌握了它。玩弄事物通常是学习任何技术的最佳方式。
【讨论】:
如果没有备忘单,我仍然无法在动画中指定目标属性:
<DoubleAnimation
Storyboard.TargetProperty=
"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
To="1.2" Duration="0:0:.2" />
【讨论】:
布局在 WPF 中有所不同,请参阅 http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/layout-techniques-for-windows-forms-developers.aspx 了解如何使用布局编辑器
【讨论】:
让我们从初学者的角度来看。我正在使用 KaXML 或 Sharpdevelop 等简单的编辑器进行 WPF 开发。我发现没有数据库网格组件我无法继续进行数据库开发。所以它不像 Windows 窗体。开始搜索商业数据库网格组件。在辩护中,人们会说这不是最难的事情或限制。
您必须使用 C# 文件或 .NET Framework 支持的其他语言文件来进行严肃的应用程序开发。如果这不会造成问题,那么为什么我需要首先使用它。我对 C# 很满意,为什么我需要使用 WPF?
迄今为止最困难的事情:
【讨论】:
最大的麻烦是:您不能只让另一个开发人员来开发由专业人士完成的 WPF 应用程序。 WinForms 和 Asp.net 的情况并非如此,任何人都可以解决很少的问题。这是一个重大问题。
【讨论】:
Binding 语法的区别之一;即何时使用绑定以及何时使用静态资源/动态资源。当我第一次学习 WPF 时,我一直把两者混为一谈。
DP的不同形式和附加属性一开始也很难理解。
【讨论】:
通读书籍并理解其中的内容是一回事,将它们应用到您的项目中是另一回事。我正在创建一个相对简单的联系人列表控件,就像在 Outlook 中一样,并且遇到了许多小而明显的学习曲线。
DataTrigger(谁会想到)。ItemsPanel 突然变成了一个挑战,因为它没有安排项目(您必须使用它)。RelativeSource。基本上能够在模板中绑定控件(从父级到子级,反之亦然)是一个很好的学习曲线。
我的建议。编写一个小应用程序,您会发现一切顺利。
【讨论】: