热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dotnet通过Elmish.WPF使用F#编写WPF应用

本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis

本文来安利大家一个有趣而且强大的库,通过 F# 和 C# 混合编程编写 WPF 应用,可以在 WPF 中使用到 F# 强大的数据处理能力

在 GitHub 上完全开源 Elmish.WPF 库,请看 https://github.com/elmish/Elmish.WPF

在阅读本文之前,我期望大家已了解部分 F# 的知识。在学会 C# 基础知识之下,了解 F# 基础知识是很快的,而本文也仅仅只是用到很少的知识。大家都知道,使用 F# 能带来很好的数据处理能力,从 F# 语法层面带来的编写效率提升和编写逻辑的优化,而 F# 本身是没有带 GUI 可视化应用编程的。但是 F# 是在 dotnet 体系下的,天然就可以用上 dotnet 系的技术,当然就包括 WPF 了。因此上一句话说 F# 本身是没有带 GUI 可视化应用编程是完全错误的,因为 F# 可以非常方便调起 WPF 和 WinForms 等成熟的 UI 框架作为自身的可视化应用框架

通过 Elmish.WPF 库,将可以让开发更顺,以下是一个简单的例子。这个例子的代码完全放在 Elmish.WPF 库里,可以通过 https://github.com/elmish/Elmish.WPF 获取所有代码

咱依然通过 VS 创建一个空白的 C# 空白 WPF 程序,在此例子里面,几乎没有 C# 多少的戏份,只是为了使用 C# 更好的驱动 WPF 程序而已,因为部分初始化方法和类型等在 F# 写起来的代码量可不少。本文的主角将交给 XAML 和 F# 这两个语言

打开 App.xaml.cs 文件,咱将修改本文仅有的一点 C# 代码

public partial class App : Application{public App(){this.Activated += StartElmish;}private void StartElmish(object sender, EventArgs e){this.Activated -= StartElmish;Program.main(MainWindow);}}

以上代码的 Program 类是在 F# 项目里面编写的,也就是说 C# 语言只是胶水,用来做初始化的连接

接下来咱来创建一个简单的界面,这个界面如下

基本功能是点击加号和减号分别实现当前数值的加减

大概的 XAML 代码如下

在 XAML 中定义了命令和值的绑定,没有做实际的实现

接下来创建一个 F# 项目,将这个项目被刚才创建的 WPF 项目所引用,将 WPF 项目作为启动项目。运行的顺序是先启动 WPF 项目,进入 App 类里面,在 App 的 Activated 事件,调用 F# 项目的逻辑,然后接下来就交给 F# 来进行数据绑定,在 F# 项目中,将给 MainWindow 附加自身作为 DataContext 数据用于在 XAML 绑定

在 F# 的 Program.fs 文件里面添加如下代码

module Elmish.WPF.Samples.SingleCounter.Programopen Serilog
open Serilog.Extensions.Logging
open Elmish.WPFtype Model &#61;{ Count: intStepSize: int }type Msg &#61;| Increment| Decrement| SetStepSize of int| Resetlet init &#61;{ Count &#61; 0StepSize &#61; 1 }let canReset &#61; (<>) initlet update msg m &#61;match msg with| Increment -> { m with Count &#61; m.Count &#43; m.StepSize }| Decrement -> { m with Count &#61; m.Count - m.StepSize }| SetStepSize x -> { m with StepSize &#61; x }| Reset -> initlet bindings () : Binding list &#61; ["CounterValue" |> Binding.oneWay (fun m -> m.Count)"Increment" |> Binding.cmd Increment"Decrement" |> Binding.cmd Decrement"StepSize" |> Binding.twoWay((fun m -> float m.StepSize),int >> SetStepSize)"Reset" |> Binding.cmdIf(Reset, canReset)
]let designVm &#61; ViewModel.designInstance init (bindings ())let main window &#61;let logger &#61;LoggerConfiguration().MinimumLevel.Override("Elmish.WPF.Update", Events.LogEventLevel.Verbose).MinimumLevel.Override("Elmish.WPF.Bindings", Events.LogEventLevel.Verbose).MinimumLevel.Override("Elmish.WPF.Performance", Events.LogEventLevel.Verbose).WriteTo.Console().CreateLogger()WpfProgram.mkSimple (fun () -> init) update bindings|> WpfProgram.withLogger (new SerilogLoggerFactory(logger))|> WpfProgram.startElmishLoop window

十分简单的逻辑&#xff0c;在 F# 定义的命令等将可以通过 Elmish.WPF 库和 WPF 的 XAML 绑定&#xff0c;相当于 XAML 提供界面逻辑&#xff0c;而 F# 提供数据驱动的处理逻辑。各个语言的职责是 XAML 负责界面&#xff0c;而 F# 负责后台逻辑。将 XAML 和 F# 连接起来以及应用程序的启动是 C# 语言

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问&#xff0c;里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园&#xff0c;但是一旦发布了就不再更新

如果在博客看到有任何不懂的&#xff0c;欢迎交流&#xff0c;我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题&#xff0c;可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布&#xff0c;但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd )&#xff0c;不得用于商业目的&#xff0c;基于本文修改后的作品务必以相同的许可发布。如有任何疑问&#xff0c;请与我联系。


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
author-avatar
吴为36
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有