Skip to content
Develop cross-plattform MVU GUI Applications using F# and Avalonia!
Branch: master
Clone or download
Latest commit 8af4315 Nov 13, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
github/img Delete icon.png Nov 13, 2019
src add Clock example (#44) Nov 13, 2019
.gitattributes clean Jun 20, 2019
.gitignore Remove files that don't belong in the repo (#28) Oct 26, 2019
LICENSE clean Jun 20, 2019 Update CI badge Nov 13, 2019
azure-pipelines.yml Update azure-pipelines.yml for Azure Pipelines Nov 13, 2019

Avalonia FuncUI

Avalonia FuncUI

Develop cross-plattform MVU GUI Applications using F# and Avalonia!

GitHub top language GitHub repo size

A new major version is currently in development. Most problems that are inherited from the current architecture will be addressed. There will be breaking changes. It is basically a rewrite to get things right from the ground up. This also means there will be new features such as 📣 subscribable properties, a better discoverable DSL, even more strongly typed views and more to come.

(Application was created using Avalonia.FuncUI!)


This library allows you to write cross-plattform GUI Applications entirely in F# - No XAML, but a declarative elm like DSL. MVU (Model-View-Update) architecture support is built in, and bindings to use it with Elmish are also ready to use.

Getting started

Check out the Wiki (WIP) and Examples.

🧱 Templates

Install the templates nuget / fuget

dotnet new -i JaggerJo.Avalonia.FuncUI.Templates

Create new app

dotnet new avalonia-funcUI-basic -n NewApp

📦 Packages

Avalonia.FuncUI nuget / fuget

Install-Package JaggerJo.Avalonia.FuncUI

Avalonia.FuncUI.Elmish nuget / fuget

Install-Package JaggerJo.Avalonia.FuncUI.Elmish

Current State

Should be usable, API is stable-ish (expect some minor changes).


Please contribute to this library through issue reports, pull requests, code reviews and discussion.


Below is the code of a simple counter app (using the Avalonia.FuncUI.Elmish package).

module Counter =

    type CounterState = {
        count : int

    let init = {
        count = 0

    type Msg =
    | Increment
    | Decrement

    let update (msg: Msg) (state: CounterState) : CounterState =
        match msg with
        | Increment -> { state with count =  state.count + 1 }
        | Decrement -> { state with count =  state.count - 1 }
    let view (state: CounterState) (dispatch): IView =
        DockPanel.create [
            DockPanel.children [
                Button.create [
                    Button.onClick (fun _ -> dispatch Increment)
                    Button.content "click to increment"
                Button.create [
                    Button.onClick (fun _ -> dispatch Decrement)
                    Button.content "click to decrement" 
                TextBlock.create [
                    TextBlock.dock Dock.Top
                    TextBlock.text (sprintf "the count is %i" state.count)
You can’t perform that action at this time.