【问题标题】:What are the real-world benefits of declarative-UI languages such as XAML and QML?XAML 和 QML 等声明式 UI 语言的实际优势是什么?
【发布时间】:2011-02-11 22:59:57
【问题描述】:

我目前正在评估QtQuick(Qt 用户界面创建工具包),它将作为 Qt 4.7 的一部分发布。 QML 是 QtQuick 背后基于 JavaScript 的声明性语言。

这似乎是一个非常强大的概念,但我想知道是否有人在 WPF 或 Silverlight 中广泛使用其他更成熟的声明性 UI 语言(如 XAML),可以深入了解现实世界的好处这可以从这种编程风格中获得。各种优点经常被引用:

  • 发展速度
  • 强制分离表示和逻辑
  • 编码人员和设计人员之间的更好集成
  • UI 更改不需要重新编译

另外,有什么缺点吗?我想到了一些潜在的关注领域:

  • 执行速度
  • 内存使用情况
  • 增加了复杂性

还有其他需要考虑的因素吗?

【问题讨论】:

  • XAML 提供了一种不同的编码风格来表达复杂的层次关系。当您将其与通用标记扩展结合使用时,您将获得一个极其强大的系统,用于以简洁的方式构造和关联对象。
  • 我刚刚开始阅读这个讨论。 Xaml 和 Qml 只是对最初在 Mac 上开发并进入 Windows 的旧资源文件的重新发明。 XML 现在在一些更喜欢 Json 的人中已经失宠,Json 更像是资源文件格式。回到过去,在命令行从他们的 UNIX 洞穴中爬出来之前,我们有 GUI 可以对您隐藏文件格式。没有人抱怨它,因为它确实有效。有趣的是,变化越多,它们就越保持不变。

标签: wpf qt xaml qml


【解决方案1】:

QML/XAML 是:

  • 非常适合 MVVM 模式
  • 硬件加速(使用适用于 Windows、MAC、Linux 和手机操作系统的 OpenGL 的 QML...使用适用于 Windows 及其手机版本的 DirectX 的 XAML)
  • 更接近艺术家
  • 您可以使用 XAML/QML 创建一个非常棒的用户界面
  • 更简单的 UI 实现
  • 可以制作漂亮的动画
  • 在 XAML 中,通常只需稍作改动即可创建应用程序的 Silverlight 版本
  • 在 XAML 中,有一些很棒的功能,例如模板、触发器(DataTrigger、Trigger、EventTrigger)、绑定(在任何一侧以及同时在两侧)、资源、命令、DependencyProperty 和 Notifiable Properties。

但请注意 XAML:(我是 XAML 程序员,因此我对 QML 没有积分)

  • 无法进行 XAML 调试
  • 对于 XAML 中的任何更改,必须重新编译所有程序
  • 对性能要更加小心。例如,如果您在 XAML 中使用了很多 RoutedCommand,您的应用程序将无法使用!

  • 在 XAML 中,某些功能无法按预期工作。不幸的是,有一些技巧。 (应该很清楚......应该按预期工作......不是吗?)

  • 小心一些类似的命名空间,如 BitmapEffect 和 Effect。有不同的功能和成本。 (例如,BitmapEffect 对软件渲染有一些效果,Effect 对硬件渲染有一些影响)

  • 在现实世界中,艺术家无法将 WPF 用作 Flash(至少性能良好)。

  • 某些功能适用于特殊位置。例如,DataTrigger 仅适用于 Style 标记,而不适用于 Resource 部分。

  • XAML 中存在一些弱点。一些例子:没有任何顺序动画......你不能在 XAML 中进行任何计算(你必须在 C# 中编写一个转换器,即使是为了一点点工作!JavaSript 是 QML 中的一个很好的替代品)......一些属性是重复的。例如x:Name and Name... 从 ViewModel 控制视图尚不清楚。例如从 ViewModel 关闭视图(你需要一些 CodeBehind)

  • 太多的运行时错误。如果你在不好的地方使用了一些标签,它会注意到你的语法错误,但许多错误只是在运行时发生。例如如果我将 ColorAnimation 的背景属性(而不是 Background.Color)作为目标,它将成功编译,但在运行动画时...... BUMP......运行时错误!在 Expression Blend 上的这种情况下,应用程序将崩溃!!!

【讨论】:

    【解决方案2】:

    QtQuick 可以通过 C++ 插件进行扩展,实际上 Qt 专家建议你在 QtQuick/QML 中执行 UI、动画、转换等,而所有业务逻辑都在 C++/Qt 中。因此,通过这种方式,您可以两全其美,您可以像往常一样调试您的 C++ 代码,同时使 UI 变得轻松且极其简单。

    关于 QtQuick/XAML 的另一个重要考虑是它们是硬件加速的,因此例如您可以毫不费力地获得相当好的 fps。所以他们对于他们要完成的事情一点也不慢。

    它节省了很多时间。我在 3 天内完成了一个带有代码的 UI,在 2 小时内完成了 QML。

    【讨论】:

    【解决方案3】:

    声明性编码(即 WPF 或 QTQuick)的重点是在开发人员和可能实现应用程序视觉方面的艺术家之间提供分离。关于 WPF,我发现调试变得有点困难。正如我们所说,我正在编译最新的 QT 来查看 QTQuick。 (这需要很长时间,我有时间看看 stackoverflow :-))所以,我对此还没有意见。

    【讨论】:

    • 调试怎么变难了?我同意你得到的异常更难调试,但这些不应该发生,而是由你的代码处理并由你的单元测试覆盖。 WPF + MVVM 的重点是让 GUI 逻辑无需调试即可测试。
    • 理论上是的。但在实践中,当您将代码和 UI 放在一起时,当问题实际上出在您的业务逻辑中时,异常似乎会从 UI 代码中抛出。我发现编译器也会混淆并误报错误位置。我认为只有经验才能克服这些问题。
    • @Tigraine,调试因为 WPF 在后台线程中做了很多工作。当其中一个线程抛出异常时,你得到的只是一个堆栈跟踪,它在识别错误​​来源方面几乎没有用处。
    【解决方案4】:

    (更新)

    对 XAML 的误解是它没有被编译。它确实被编译为 BAML 二进制预标记 XAML。显然有一个 IL 编译版本的 XAML 也称为 CAML。 OP 向我指出了这个 good article,它解释了 XAML/BAML 和 CAML 是什么。

    无论如何,关于为什么要使用它的问题:

    XAML 只是 C# 对象的序列化格式,它特别适合描述分层对象结构,例如 WPF GUI 中的结构。

    WPF 可以帮助您编写不那么枯燥的 C# 代码,如下所示:

    var grid = new Grid();
    grid.Content.add(new TextBlock() {Text = "Hello"});
    grid.Content.add(new TextBlock() {Text = "World"});
    

    并以更易读的方式表达,如下所示:

    <Grid>
      <TextBlock Text="Hello">
      <TextBlock Text="World">
    </Grid>
    

    由于 WPF 对象嵌套(将内容放入其他对象中)可能会变得非常深,因此 WPF 使其比生成的 C# 代码更易于阅读。

    至于关注点分离:XAML 在这里也有帮助,因为它只允许您表达对象及其关系/属性,而不是逻辑。这迫使您将逻辑与 UI 布局分开。 MVVM 模式非常适合这项任务,并允许简单的可测试性和可互换的视图。

    XAML 中增加的复杂性也很容易被忽略,因为 C# 中的相同代码很容易变得比 XAML 标记更复杂。

    不过,我无法让您深入了解 QTQuick。对不起

    【讨论】:

    • 你确定吗?我的理解是 XAML 被编译为中间二进制格式 (BAML)。快速谷歌似乎证实了这种情况:blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/…3D00-BAML-not-IL.aspx
    • 该死,你是对的。我会立即编辑答案。我认为他们对 IL 进行了反序列化(我的假设基于 WPF Unleashed,他们解释说 XAML 只是 C# 对象的序列化格式)。我猜 MS 有充分的理由将其编译为 baml(如果我理解正确,仍然是编译的二进制格式),而不是必须解析的 XML 格式。但你是对的,它比纯 IL 慢一些。
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2010-10-10
    • 2023-04-06
    • 2017-03-16
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多