dotnet 透過 Elmish.WPF 使用 F# 編寫 WPF 應用
本文來安利大家一個有趣而且強大的庫,透過F#和C#混合程式設計編寫WPF應用,可以在WPF中使用到F#強大的資料處理能力
在閱讀本文之前,我期望大家已瞭解部分F#的知識。在學會C#基礎知識之下,瞭解F#基礎知識是很快的,而本文也僅僅只是用到很少的知識。大家都知道,使用F#能帶來很好的資料處理能力,從F#語法層面帶來的編寫效率提升和編寫邏輯的最佳化,而F#本身是沒有帶GUI視覺化應用程式設計的。但是F#是在dotnet體系下的,天然就可以用上dotnet系的技術,當然就包括WPF了。因此上一句話說F#本身是沒有帶GUI視覺化應用程式設計是完全錯誤的,因為F#可以非常方便調起WPF和WinForms等成熟的UI框架作為自身的視覺化應用框架
透過Elmish.WPF庫,將可以讓開發更順,以下是一個簡單的例子。這個例子的程式碼完全放在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程式碼如下
<StackPanel Orientation="Horizontal"HorizontalAlignment="Center"VerticalAlignment="Top"Margin="0,25,0,0">
<TextBlock Text="{Binding CounterValue,StringFormat='Counter value:{0}'}"Width="110"Margin="0,5,10,5"/>
<Button Command="{Binding Decrement}"Content="-"Margin="0,5,10,5"Width="30"/>
<Button Command="{Binding Increment}"Content="+"Margin="0,5,10,5"Width="30"/>
<TextBlock Text="{Binding StepSize,StringFormat='Step size:{0}'}"Width="70"Margin="0,5,10,5"/>
<Slider Value="{Binding StepSize}"TickFrequency="1"Maximum="10"Minimum="1"IsSnapToTickEnabled="True"Width="100"Margin="0,5,10,5"/>
<Button Command="{Binding Reset}"Content="Reset"Margin="0,5,10,5"Width="50"/>
</StackPanel>
在XAML中定義了命令和值的繫結,沒有做實際的實現
接下來建立一個F#專案,將這個專案被剛才建立的WPF專案所引用,將WPF專案作為啟動專案。執行的順序是先啟動WPF專案,進入App類裡面,在App的Activated事件,呼叫F#專案的邏輯,然後接下來就交給F#來進行資料繫結,在F#專案中,將給MainWindow附加自身作為DataContext資料用於在XAML繫結
在F#的Program.fs檔案裡面新增如下程式碼
module Elmish.WPF.Samples.SingleCounter.Program
open Serilog
open Serilog.Extensions.Logging
open Elmish.WPF
type Model=
{Count:int
StepSize:int}
type Msg=
|Increment
|Decrement
|SetStepSize of int
|Reset
let init=
{Count=0
StepSize=1}
let canReset=(<>)init
let update msg m=
match msg with
|Increment->{m with Count=m.Count+m.StepSize}
|Decrement->{m with Count=m.Count-m.StepSize}
|SetStepSize x->{m with StepSize=x}
|Reset->init
let bindings():Binding<Model,Msg>list=[
"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=ViewModel.designInstance init(bindings())
let main window=
let logger=
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
十分簡單的邏輯,在F#定義的命令等將可以透過Elmish.WPF庫和WPF的XAML繫結,相當於XAML提供介面邏輯,而F#提供資料驅動的處理邏輯。各個語言的職責是XAML負責介面,而F#負責後臺邏輯。將XAML和F#連線起來以及應用程式的啟動是C#語言。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997029/viewspace-2773551/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用dotnet core 編寫REST風格APIRESTAPI
- BRANCH透過收購打造應用程式使用新方式
- 使用 dotnet-monitor 分析.NET 應用程式
- Go 編寫 Web 應用GoWeb
- 使用Golang語言編寫Hello World Web應用GolangWeb
- 使用rust編寫dwm status-bar應用程式Rust
- 使用flutter編寫一款視訊應用Flutter
- 透過編寫“猜數字”遊戲來學習 Awk遊戲
- 使用 Tye 輔助開發 dotnet 應用程式
- WPF 應用遷移到 Electron 框架過程記錄框架
- 使用Golang的Gin框架和vue編寫web應用Golang框架VueWeb
- 使用 Swift 語言編寫 Android 應用入門SwiftAndroid
- 用PHP編寫Android應用程式PHPAndroid
- 透過機器人應用視覺機器人視覺
- dotnet 9 WPF 連字元渲染支援字元
- 學習F#這個優美的語言及F#應用的原創影片推薦
- 編寫高效的MySQL應用(轉)MySql
- WPF WriteableBitmap透過GDI+繪製幫助類
- 透過遞迴查詢應用依賴遞迴
- 使用Intellij Idea編寫Spark應用程式(Scala+SBT)IntelliJIdeaSpark
- 使用 TypeScript 編寫 SAP UI5 應用的準備工作TypeScriptUI
- 高分透過!TCE高分透過密碼應用安全性評估(3級)密碼
- 編寫友好的命令列應用程式命令列
- [譯] 如何編寫全棧 JavaScript 應用全棧JavaScript
- 編寫iOS應用程式有何不同iOS
- 透過編寫模組化程式碼提高軟體可移植性(轉)
- 如何透過SK整合chatGPT實現DotNet專案工程化?ChatGPT
- 一個基於Java的介面快速開發框架!無需編寫程式碼,透過UI介面編寫介面!Java框架UI
- 30分鐘編寫一個Flask應用Flask
- 編寫高效能HTML網頁應用HTML網頁
- 編寫第一個HADOOP應用程式Hadoop
- 為Linux 應用程式編寫 DLL(轉)Linux
- (二)透過fork編寫一個簡單的併發伺服器伺服器
- 使用Python編寫一個滲透測試探測工具Python
- #使用C#winform編寫滲透測試工具--子域名挖掘C#ORM
- dotnet core使用開源元件FastHttpApi進行web應用開發元件ASTHTTPAPIWeb
- 編寫多執行緒應用程式,模擬多個人通過一個山洞:執行緒
- 使用GoogleAppEngine、GoogleClosureLibrary與Clojure編寫HTML5應用GoAPPHTML