wpf - JavaFX 与 WPF 相比如何?

标签 wpf javafx-2 javafx

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




我主要是一名 C# 程序员,大约 10 年前我停止编写 Java,但我尝试通过阅读文章、与 friend 交谈等来跟上 Java 技术。

我听说过名为 JavaFX 的新富 GUI 框架,但找不到任何资源将其与非 Java 并行项进行比较。

由于我对 C# 和 WPF 非常熟悉,因此我想了解一下这两种技术的相似或不同之处。

编辑:看到没有答案,我会尝试更具体:

  • WPF 使用 XAML 创建可视化树,JavaFX 有类似的吗?
  • WPF 最适合用于绑定(bind)到 MVVM 模式中的 View 模型,JavaFX 是否也广泛使用了绑定(bind)?
  • WPF 利用 GPU 进行渲染,JavaFX 是否也这样做?
  • 当通过网络 PC 上的浏览​​器运行时,Silverlight 与 JavaFX 相比如何?

  • ……更多……

    我正在将其更改为社区维基,以便比较可以不断更新(希望如此)。

    最佳答案

    过去几周我一直在学习 JavaFX。这是我眼中它与 WPF 的比较的高级概述:

    我所有的评论都与 JavaFX 2.0 相关。由于该平台还相当不成熟并且正在积极开发中,因此这些信息可能会发生变化。

    图形

    与 WPF 一样,JavaFX 使用保留的图形渲染系统。用户界面包括一个由“节点”组成的场景图,可以认为在概念上类似于 WPF 的 UIElement .

    如果可用,JavaFX 会将图形渲染卸载到 GPU。图形系统在 Windows 上使用 DirectX,在其他平台上使用 OpenGL。

    标记

    JavaFX 用户界面既可以在代码中创建,也可以通过 FXML 标记创建,这类似于 XAML,因为可以通过嵌套元素创建对象图。

    FXML 具有一些与 XAML 相似的功能,例如属性绑定(bind)(仅限简单表达式)和绑定(bind)到事件处理程序(任何 onEvent 方法)。事件处理程序可以内联声明,但通常您会绑定(bind)到关联 Controller 中的事件。

    FXML 文件可以有一个关联的 Controller ,它允许您声明复杂的事件处理程序并设置属性之间的绑定(bind)。这是 MVC 意义上的 Controller ,与 WPF 世界中的 viewModel 不同(通常 Controller 将引用节点和控件)。

    与 WPF 的一个不同之处在于,FXML 似乎没有被编译成像 BAML 这样的中间二进制表示。我还没有注意到任何性能问题,但还没有广泛使用该系统。但我注意到,FXML 通常比任何 XAML 都短,因为该平台仍然鼓励您编写代码并且样式是单独声明的。

    可以在 here 中找到 FXML 的介绍。 .

    免费提供场景构建器(如啤酒),因此如果您不喜欢手动编码 UI,您可以拖放元素、设置属性并绑定(bind)到 Controller 中的代码,FXML 将自动生成。显然,场景构建器远不如 Expression Blend 强大,但它仍然比 Visual Studio 提供的“设计器”更好。

    装订

    JavaFX 具有非常强大的属性和绑定(bind)系统。 Java Bean 模式已扩展为包括封装属性的类(类似于 WPF 依赖属性表示属性的方式)。这些类实现提供失效和更改通知的接口(interface)。

    失效通知和更改通知之间存在区别。 Invalidations 只是告诉你绑定(bind)表达式现在无效,需要重新计算;在您通过其 get() 请求属性值之前,重新计算实际上不会发生。或 getValue()方法。但是,如果您注册了更改监听器,则表达式将立即重新计算,并且绑定(bind)到该属性的任何内容都将反射(reflect)更改。

    JavaFX 以类似于 WPF 的方式公开这些属性,具有 get 和 set 属性以及返回属性包装器实例的方法(它们不像 WPF 属性那样是静态的)。

    可以在多个属性之间创建复杂的绑定(bind)。想要一个整数属性是另外两个的总和 (a = b + c)?没问题,JavaFX 提供了一个 Fluent API 来表达这些关系

    A.Add(B, C);



    如果 B 或 C 的值发生变化,则会发出适当的通知,以便系统知道需要重新评估 A。请注意,在这种情况下,如果您尝试设置 A 的值,因为它绑定(bind)到其他属性,因此在这种情况下没有意义,则会引发异常。

    这些表达式可能相当复杂a = (b + c) * (d - e)并且可以包含任意数量的属性。 fluent API 相当容易阅读和使用,但不如某些 Microsoft 库提供的一些 Fluent API 好,但这更多是由于 Java 语言限制而不是 JavaFX 本身。

    可以在相同类型的属性之间创建简单的双向绑定(bind),以便在更新一个属性时,另一个自动反射(reflect)更改。

    如果您想创建 API 未提供的自定义绑定(bind)表达式,或者您担心性能,JavaFX 还提供了一个低级 API 来自己自定义绑定(bind)。

    JavaFX 和 WPF 之间最大的区别之一是绑定(bind)主要在 JavaFX 中的代码中执行,而 WPF 在标记中建立绑定(bind)的方式。

    可以在 here 中找到对属性和绑定(bind)的介绍。 .

    款式

    JavaFX 使用 CSS 来更改场景图中包含的节点的外观。有一个完整的规范可用,它解释了可以在每个节点类型上设置的类型和属性。

    JavaFX 还提供了一些有助于改进 CSS 的附加功能,例如可以在其他地方定义和使用的变量
    .button {
        my-custom-color: RGB(234, 44, 78);
    }
    
    .my-control {
        -fx-background-color: my-custom-color
    }
    

    它还提供了一些函数,允许您从其他先前定义的颜色中派生颜色,这对于创建诸如渐变之类的东西非常有用。这意味着可以定义一个基本的颜色调色板,其余的可以从这些值生成(这是默认的 JavaFX CSS 文件所做的)。

    JavaFX CSS 不允许您定义节点使用的布局类型(在编写本文时,所有布局都需要在代码中执行)。这对我来说非常有效,因为这是 CSS 的一个方面,在将它与 HTML 一起使用时确实让我感到痛苦。

    就我个人而言,我更喜欢 CSS 而非 XAML 样式,因为 XAML 样式对于我的喜好来说过于冗长。

    可以找到 JavaFX CSS 指南 here .

    布局

    JavaFX 提供了许多与 WPF 提供的布局 Pane 类似的布局 Pane 。我注意到的一个区别是测量和布局契约在 Region 中的继承链上进一步定义。类。

    如前所述,布局不能使用 CSS 执行,但可以使用代码、FXML 表示或使用场景构建器(最终转换为 FXML)创建。

    控件

    JavaFX 提供了我们所期望的不断增长的控件库。 JavaFX 和 WPF 之间的一个主要区别是控件本质上是黑匣子,不能像 WPF 控件那样重新模板化。它们似乎也比 WPF 控件公开的属性少得多。

    这些控件确实向 CSS 公开了一些特定于实现的区域,从而允许您的样式针对控件的特定区域。这称为控件的子结构。 E.G. CheckBox暴露两个子结构;框和复选标记允许控件的每个部分独立设置样式。请注意,如前所述,只能使用 CSS 更改控件的外观,但不能更改其感觉。 E.G.您无法显着改变 TabPane 的方式通过以 WPF TabControl 的方式更改其内部布局面板来布局其内容.

    虽然这听起来相当有限,但在 JavaFX 中创建自定义控件的首选方法似乎是使用组合,沿着从布局面板派生的路线来定位标准控件并使用 CSS 重新设置它们的样式。

    结论

    总的来说,JavaFX 目前提供的功能给我留下了深刻的印象。虽然它不像 WPF 那样成熟,但它正在积极开发中,甲骨文似乎肯定支持这一点。时间会证明它是否成功。

    我建议尝试一下 JavaFX。阅读 documentation并尝试组合一个小应用程序,看看你的想法。

    您还应该查看 FXExperience.com它会根据开发团队的信息定期更新。

    关于wpf - JavaFX 与 WPF 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2016470/

    相关文章:

    c# - 我怎样才能在一个类中拥有一个属性来存储图片/图像?

    c# - WPF 绑定(bind)直到执行另一个操作后才会更新

    java - InvalidationListener 与 ChangeListener

    JavaFX BarChart 条形颜色

    javafx-2 - JavaFX 任务 : where does updateMessage() write to?

    Javafx 进度更新不够快

    java - NullPointerException 尽管 fx :id and fx:controller are correct

    WPF 图像命令绑定(bind)

    c# - WPF Datagrid 列宽最大化时调整大小

    java - 从 JavaFX 应用程序复制图像并使用 Windows 粘贴