- Введение
- Обзор библиотек
- Конвертеры значений
- FsVM - свойства
- FsVM - команды
- FsVM - валидация
- Gjallarhorn - базовые сведения
- Использование Gjallarhorn вместе с WPF
Для написания полноценных WPF
приложений на F#
существует несколько подходов:
- Не использовать разметку
xaml
, а создавать графический интерфейс полностью на F#. - Использовать
XamlReader
для разбора файлов разметки. - Использовать
FsXaml
для работы с.xaml
файлами.
И, конечно, есть еще вариант писать UI часть на C#, но здесь его в расчет брать не будем.
В качестве иллюстрации напишем стандартный Hello World
, для этого создадим простое консольное приложение.
Примечание
Если вы создали консольное приложение в
VisualStudio
, то не забудьте изменить в настройках приложения тип выходных данных с консольного на Windows
Добавим ссылки на следующие сборки:
- WindowsBase.dll
- PresentationCore.dll
- PresentationFramework.dll
Теперь используем базовые WPF
элементы Label
для отображения приветственной надписи и Window
для окна вывода.
В результате код может выглядеть подобным образом (хотя здесь он и намеренно упрощен):
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)
[<STAThread>]
Application().Run win
|> ignore
Для второго способа усложним пример так, чтобы классическое сообщение выводилось при нажатии на кнопку.
open System
open System.Windows
open System.Windows.Controls
open System.Windows.Markup
let windowXaml = """
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Height = "57" Width = "100">
<StackPanel>
<Button Name="HelloWorldButton">Тыц</Button>
</StackPanel>
</Window>"""
let win = XamlReader.Parse windowXaml :?> Window
let button = win.FindName "HelloWorldButton" :?> Button
button.Click.Add
(fun _ -> MessageBox.Show "Привет, МИР!" |> ignore)
[<STAThread>]
Application().Run win
|> ignore
Подробнее о возможностях XamlReader
можно узнать в документации.
Теперь о последнем из перечисленных подходов. FsXaml
это поставщик типов (type provider) который служит для генерации F# - типов для наших XAML - файлов.
Для добавления в проект через NuGet
Install-Package FsXaml.Wpf
или, если предпочитаете paket
:
paket add FsXaml.Wpf --version 3.1.6
Примечание
В этом случае предварительный шаг делать не нужно, так как все требуемые ссылки на сборки будут автоматически добавлены при установке пакета,
Пример:
open FsXaml
open System
open System.Windows
type MainWindowBase = XAML<"MainWindow.xaml">
[<STAThread>]
MainWindowBase()
|> Application().Run
|> ignore
Здесь MainWindow.xaml
файл с разметкой, который должен быть отмечен как ресурс.
О преимуществах использования FsXaml
над XamlReader
можно прочитать тут
У каждого из описанных выше подходов есть свои сильные стороны, но для относительно небольших приложений скорее всего удобнее будет использовать именно FsXaml
.
- FsXaml.Wpf - 3.1.16
- FSharp.ViewModule - 1.0.5
- Gjallarhorn - Gjallarhorn 0.0.9 (beta)