https://github.com/foggyfinder/fsharpwpfnotes
Некоторые заметки касающиеся F# и WPF
https://github.com/foggyfinder/fsharpwpfnotes
f-sharp wpf
Last synced: 5 months ago
JSON representation
Некоторые заметки касающиеся F# и WPF
- Host: GitHub
- URL: https://github.com/foggyfinder/fsharpwpfnotes
- Owner: FoggyFinder
- Created: 2017-01-26T20:14:37.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2019-09-01T17:30:54.000Z (over 6 years ago)
- Last Synced: 2025-03-20T14:48:32.244Z (9 months ago)
- Topics: f-sharp, wpf
- Size: 37.1 KB
- Stars: 5
- Watchers: 1
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Содержание ##
1. [Введение](#Введение)
2. [Обзор библиотек](ru/LibrariesOverview.md)
2. [Конвертеры значений](ru/ValueConverter.md)
4. [FsVM - свойства](ru/ex1FSVM.md)
5. [FsVM - команды](ru/Command.md)
6. [FsVM - валидация](ru/Validation.md)
7. [Gjallarhorn - базовые сведения](ru/IntroductionGjl.md)
8. [Использование Gjallarhorn вместе с WPF](ru/GjlWpf.md)
---------
#### Введение
Для написания полноценных `WPF` приложений на `F#` существует несколько подходов:
1. Не использовать разметку `xaml`, а создавать графический интерфейс полностью на F#.
2. Использовать `XamlReader` для разбора файлов разметки.
3. Использовать `FsXaml` для работы с `.xaml` файлами.
И, конечно, есть еще вариант писать UI часть на C#, но здесь его в расчет брать не будем.
В качестве иллюстрации напишем стандартный `Hello World`, для этого создадим простое консольное приложение.
*Примечание*
> Если вы создали консольное приложение в `VisualStudio`, то не забудьте изменить в настройках приложения тип выходных данных с консольного на Windows
Добавим ссылки на следующие сборки:
- WindowsBase.dll
- PresentationCore.dll
- PresentationFramework.dll
Теперь используем базовые `WPF` элементы `Label` для отображения приветственной надписи и `Window` для окна вывода.
В результате код может выглядеть подобным образом (хотя здесь он и намеренно упрощен):
```fsharp
open System
open System.Windows
open System.Windows.Controls
let label = Label(FontSize=30.0, Content="Привет, МИР!")
let win = Window(Height=100.0, Width=240.0, Content=label)
[]
Application().Run win
|> ignore
```
Для второго способа усложним пример так, чтобы классическое сообщение выводилось при нажатии на кнопку.
```fsharp
open System
open System.Windows
open System.Windows.Controls
open System.Windows.Markup
let windowXaml = """
Тыц
"""
let win = XamlReader.Parse windowXaml :?> Window
let button = win.FindName "HelloWorldButton" :?> Button
button.Click.Add
(fun _ -> MessageBox.Show "Привет, МИР!" |> ignore)
[]
Application().Run win
|> ignore
```
Подробнее о возможностях `XamlReader` можно узнать в [документации](https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.markup.xamlreader?view=netframework-4.7.2).
Теперь о последнем из перечисленных подходов. [`FsXaml`](https://github.com/fsprojects/FsXaml) это поставщик типов (type provider) который служит для генерации F# - типов для наших XAML - файлов.
Для добавления в проект через NuGet
```powershell
Install-Package FsXaml.Wpf
```
или, если предпочитаете `paket`:
```powershell
paket add FsXaml.Wpf --version 3.1.6
```
*Примечание*
> В этом случае предварительный шаг делать не нужно, так как все требуемые ссылки на сборки будут автоматически добавлены при установке пакета,
Пример:
```fsharp
open FsXaml
open System
open System.Windows
type MainWindowBase = XAML<"MainWindow.xaml">
[]
MainWindowBase()
|> Application().Run
|> ignore
```
Здесь `MainWindow.xaml` файл с разметкой, который должен быть отмечен как ресурс.
О преимуществах использования `FsXaml` над `XamlReader` можно прочитать [`тут`](http://stackoverflow.com/questions/30859148/advantage-of-fsxaml-type-provider-over-xamlreader)
У каждого из описанных выше подходов есть свои сильные стороны, но для относительно небольших приложений скорее всего удобнее будет использовать именно `FsXaml`.
-------
## Используемые версии библиотек ##
- FsXaml.Wpf - **3.1.16**
- FSharp.ViewModule - **1.0.5**
- Gjallarhorn - **Gjallarhorn 0.0.9 (beta)**