【问题标题】:How bad is the WPF Learning Curve? [closed]WPF 学习曲线有多糟糕? [关闭]
【发布时间】:2010-11-15 18:47:37
【问题描述】:

我从几个人那里读到并听说WPF 的学习曲线非常陡峭(取决于您的知识或经验如何)。似乎大多数人可以让演示或启动项目工作,然后发现自己在杂项问题上卡住了很长时间。我很好奇哪些具体是难以学习或理解的(层、SDK、XAML、数据绑定等),如果您对如何避免/减轻其中一些困难主题有任何建议?

【问题讨论】:

  • 你有没有被列入 Miguel 的 SO podcast 61?精彩的一集……
  • 不,我没有,我必须检查一下,谢谢!

标签: c# wpf


【解决方案1】:

WPF 不同;没有办法摆脱这一点。

我的主要建议是不要害怕 XAML;拥抱它,这就是力量所在!

让我解释一下:-

为了提高工作效率,我更喜欢在文本视图中编写 XAML,因为我可以通过几次击键来创建窗口的裸布局。如果您经常键入代码,那么这是开发 Windows 的一种非常快速的方法。然后,您可以使用可视化编辑器使其看起来更漂亮。

如果您牢记 XAML 的每个元素都将“new”该对象,并且该 XAML 元素的每个属性都是该对象的属性,那么您可以将 XAML 视为对象创建和属性分配.非常类似于写代码。

如果你花太多时间在视觉设计师身上,那么你就不会欣赏这一点,而且对于某些人来说,这会减慢学习曲线。

您可能对最近的 Hanselminutes 播客感兴趣。

我还强烈建议尽早学习视图和视图模型的概念,即使您不订阅 CompositeWPF 的所有内容,因为这确实有帮助。

【讨论】:

  • 实际上 CompositeWPF 并不订阅单一的 GUI 模式,如 MVVM、MVP、MVC 等。我似乎记得使用 MVP 的参考实现。 MVVM 似乎是 WPF 中最受欢迎的。
  • +1(如果可以的话,还有更多)是为了输入 XAML 而不是先设计它。 XAML 构建对象层次结构。这些对象是您需要学习使用 WPF 的。了解这一点,其余的就开始到位。很好的答案。
【解决方案2】:

有一篇来自 Karsten Januszewski 的好文章,名为 Hitting the Curve: On WPF and Productivity,您可能会觉得有趣:

让我们明确一点:WPF 带有一个 曲线。我现在看了一堆 开发人员达到了这条曲线。和 曲线陡峭。我们之间正在谈论 两周到两个月的曲线 取决于开发商和 经验/直觉水平 开发商有。会有时刻 完全的神秘和大量 照明的时刻。它是一次 痛苦和愉快,如果 开发商乐于发现 一个深思熟虑的用户界面 平台。它既熟悉又 外星人。有很多相似之处 其他 UI 开发范例:样式 感觉像 CSS,很好。 XAML 后面的代码感觉就像 ASP.NET,嗯 有点。 3D 感觉就像 DX 或 OpenGL, 好吧。路由事件感觉像 .NET 事件,好吧。依赖 属性感觉像属性,嗯 有点。这份名单可以继续使用。但 在这些(有点)熟悉的 比喻有这么多外星人 必须掌握的概念: 控制模板,故事板, 立即想到数据绑定。 这不是一条微不足道的曲线,不要 期望在第 1 天富有成效或 甚至是第 1 周甚至第 1 个月。

这一切都是值得的! ;)

【讨论】:

  • 根据个人经验,我同意 2 周到 2 个月的时间范围。
【解决方案3】:

学习 WPF 的难点与其说是 API,不如说是模型。这是一个与 Windows Forms 之类的思维模型截然不同的思维模型。

您通常不会编写强制填充 U​​I 元素的方法,而是将数据绑定到对象的属性。要获得复杂的行为,您通常会使用某种程度的组合。

例如,如果您在列表中有一系列想要的项目,其中一段文本后跟一张图片。在 Windows 窗体中,您将获取列表并对其进行迭代。对于列表中的每个项目,您将为项目和文本创建控件,并添加图片,然后将新的子控件添加到列表中。 (具体过程可能因控件类型而异。您可以添加 SubItems 而不是只制作一个控件等)。

WPF 会以非常不同的方式处理这个问题。在 WPF 中,在顶层,您将声明一个容器对象并将其绑定到列表。

然后,您将为该容器提供一个模板以用于显示其项目。模板基本上是另一个控件,它定义了子元素的定位,这些子元素与填充列表的类的实例绑定。

它以一种非常组合的感觉结束,并且非常强大。这也是一个与大多数开发人员习惯的非常不同的模型,在您可以内部化该模型之前,在尝试以 Windows 窗体/等方式做事时遇到问题是很常见的。

不过,一旦您习惯了该模型,再使用其他 API 就会很痛苦。不是因为它们突然变得困难,而是因为你知道事情可以变得多么容易。

【讨论】:

    【解决方案4】:

    您可能可以从我的问题历史中推断出,我肯定发现这是一条陡峭的学习曲线。你几乎完全准确地描述了我的经历。作为一个只为业余爱好者应用程序进行 WPF 编程的全日制学生(数学和物理,而不是软件工程),这是相当令人沮丧的。我尝试过在 WPF 中创建新应用程序,或者将一些旧应用程序移植到 WPF 中,但总是卡在一些看起来非常困难的小事情上。我没有做的一件事——基本上是因为时间问题——是坐下来,例如。一本书或一系列教程,并逐步完成。如果您是专业开发人员,这可能会更可行,并且可能会使 WPF 对您来说更容易。

    我认为,给我带来麻烦的最大的事情是让我了解模型-视图-视图模型范式(例如,参见 this question of mine)。而在 WinForms 中,我可以将一些东西拖放到窗体上,弄乱它的属性,并在代码隐藏中连接一些事件,现在我必须考虑将它们划分为视图、模型和视图模型。许多这些代码隐藏事件成为验证规则或数据绑定的东西。我的应用程序都不是真正的“数据操作”应用程序,这可能无济于事。也就是说,他们不操纵客户信息数据库或任何东西,其中很多都是有意义的。相反,它更像是“我想要一个用户在其中输入 URI 的文本框,并且我希望仅在该文本框包含有效 URI 时才启用显示“下载”的按钮。”像这样的小事情开始变得非常复杂。我必须考虑 URI 在我的模型中的位置、在我的视图模型中的位置、连接验证框架以及将按钮和文本框的属性数据绑定到所有这些元素。

    另一个烦人的问题是框架中缺少多少东西。例如,sorting listviews

    最后,WPF 有很多优势。 The layout framework seems a lot nicer than the primarily pixel-based WinForms model. 它使用像 Segoe UI 这样的现代字体,呵呵:P。它的合成功能也非常棒,例如将图像放在按钮上是多么自然(本质上只是将图像 XAML 标记放在按钮 XAML 标记内);我怀疑它也可以解决my problem regarding checkboxes with controls inside of them,虽然我还没有尝试这样做。

    【讨论】:

    • 克服模型/视图/视图模型切换的最佳方法是考虑“我要呈现什么数据?”创建一个公开该数据的类,您已经完成了视图模型。在 WPF 中,您最好从“呈现数据”而不是“填充控件”的角度进行思考。
    【解决方案5】:

    我已经使用 .NET 超过 4 年了,主要是 Windows Forms 应用程序。绑定并不是什么未知数,我尝试在我的所有 C# 应用程序中使用良好的实践。在过去的 1 个月里,我一直在为这项工作学习 WPF,我不得不承认它非常强大,但要实现目标要困难得多。你可以做更多事情,用更少的努力完成一些很酷的设计,但只有当你知道它是如何工作的时候,这很难,因为它很大。

    更多,调试更难 - 这也使学习更慢。我认为的问题是 Visual Studio 的 IDE,它在 XAML 中没有多大帮助,并且在进行绑定或现在位于 XML 标记中的其他内容时,您很快就会错过 C# 的 IntelliSense 的一些功能。我喜欢它,但是是的,学习曲线并不平滑。

    【讨论】:

    • 这正是我们在调试过程中所面临的。我们没有收到任何编译时或运行时错误,但事情并没有像我们想象的那样工作,有时更令人沮丧的是我们找不到原因。此外,如果我们没有意识到问题,很难在论坛上发布大量代码以获取解决方案。
    【解决方案6】:

    它可能非常陡峭。

    我花了一个月的大部分时间来试验 WPF 并在其中编写我们当前产品的模型,而没有开发出对其数据绑定模型的直觉,甚至没有弄清楚微软对它的使用意味着什么。我用更少的时间来掌握 ASP.NET MVC 的基础知识。

    [我们的应用程序显示/依赖于大量实时数据,我使用了 Nathan 的 Windows Presentation Foundation 书。也许另一本书会更合适。]

    【讨论】:

      【解决方案7】:

      一旦您大致了解 WPF 的工作原理,它就很容易了 - 试试“WPF - how and why”。 最大的问题是确定它是否值得,仍然有很多应用程序可以很好地实现为 Windows 窗体和一些图形。

      我也同意之前关于进入 XAML 的评论——它就像一个稍微复杂的 HTML,唯一真正的困难是找出什么是做什么的。至于后来在项目中被卡住 - 你不是总是在项目中被卡住吗?当你开始尝试做那 1% 时,这才是艰难的。

      【讨论】:

        【解决方案8】:

        是的,这并不容易 - 但不要害怕。关于 WPF,它经过精心设计,因此您在学习它时会得到持续的积极情绪反馈(至少我是这样做的;)。你喜欢坐着玩它,每隔几分钟就会惊叹“哇”;)

        【讨论】:

        • “持续的积极情绪反馈。”大声笑。
        • @gonzobrains 这有什么好笑的?不真实?
        【解决方案9】:

        这将是那些“视情况而定”的答案之一,但它真正取决于您是否是那种尝试不断提高技能的开发人员。如果是这样,那么最终归结为几件事。

        购买WPF Unleashed(还有其他书籍,但我强烈推荐这本),完成示例,大约 2 个月后,您会想知道没有它您是如何完成工作的。

        这不是火箭科学,也没有要处理的范式转换概念。事实上,如果您习惯于在逻辑和表示之间保持良好的分离,那么它应该适合。

        要达到精通水平,您可能需要玩 6 到 12 个月。

        祝你好运。

        【讨论】:

        • 我发现“WPF Unleashed”对于刚接触 WPF 的有经验的程序员来说是一个糟糕的选择:第 2 章过早地介绍了太多细节;作者没有解释代码 sn-ps 的放置位置,并且 XAML 文件不会像他描述的那样显示在浏览器中。我已经阅读了许多具有更好解释的资源 - 甚至 MS 的 WPF 入门网站也更加清晰。
        【解决方案10】:

        与我共事的少数人必须学习它,他们真的建议阅读 Expression Blend 的所有教程。这为他们提供了 WPF 的良好背景以及使用它时使用的更好工具。

        【讨论】:

          【解决方案11】:

          如果您有使用 HTML 或 XML 或类似语言的经验,这并不是特别困难,尤其是如果您有网页设计经验。如果您完全来自 WinForms 背景,那么学习曲线会有点陡峭。我目前正在自己​​学习 WPF,并且由于我来自广泛的 Web 开发背景,因此我发现这些概念对于大多数人来说并不难掌握。我发现 WindowsClient.net 上的在线教程视频也非常有帮助,虽然有点组织不善。

          【讨论】:

          • 我不同意这一点。了解 HTML 和 XML 固然让学习 XAML 更容易,但它与 WPF 的一些主要概念无关,例如数据绑定、命令模型、路由事件、控件模板和数据模板、依赖属性、情节提要等。跨度>
          • @Jason:WPF 的主要困难之一是表示层,而这正是网页设计背景提供帮助的地方,IMO。
          • @CamiloMartin 我不同意。漂亮的用户界面的组合是网页设计提供帮助的地方,但正如 jason 解释的那样,它与 WPF 的核心概念无关。
          猜你喜欢
          • 2014-04-01
          • 2016-01-19
          • 1970-01-01
          • 2013-01-22
          • 2019-05-04
          • 1970-01-01
          • 2011-01-21
          • 2010-11-24
          • 1970-01-01
          相关资源
          最近更新 更多