{"id":17979859,"url":"https://github.com/foggyfinder/fsharpwpfnotes","last_synced_at":"2026-03-10T20:03:40.374Z","repository":{"id":85082754,"uuid":"80151149","full_name":"FoggyFinder/FSharpWPFNotes","owner":"FoggyFinder","description":"Некоторые заметки касающиеся F# и WPF","archived":false,"fork":false,"pushed_at":"2019-09-01T17:30:54.000Z","size":38,"stargazers_count":5,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-22T14:46:23.397Z","etag":null,"topics":["f-sharp","wpf"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FoggyFinder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-26T20:14:37.000Z","updated_at":"2019-09-01T17:30:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"b20ba580-d33f-4a49-8f19-dd0c38e27e83","html_url":"https://github.com/FoggyFinder/FSharpWPFNotes","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FoggyFinder/FSharpWPFNotes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FoggyFinder%2FFSharpWPFNotes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FoggyFinder%2FFSharpWPFNotes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FoggyFinder%2FFSharpWPFNotes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FoggyFinder%2FFSharpWPFNotes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FoggyFinder","download_url":"https://codeload.github.com/FoggyFinder/FSharpWPFNotes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FoggyFinder%2FFSharpWPFNotes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30351802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:55:29.454Z","status":"ssl_error","status_checked_at":"2026-03-10T15:54:58.440Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["f-sharp","wpf"],"created_at":"2024-10-29T17:40:14.375Z","updated_at":"2026-03-10T20:03:40.352Z","avatar_url":"https://github.com/FoggyFinder.png","language":null,"readme":"﻿## Содержание  ##\n\n1. [Введение](#Введение)\n2. [Обзор библиотек](ru/LibrariesOverview.md)\n2. [Конвертеры значений](ru/ValueConverter.md)\n4. [FsVM - свойства](ru/ex1FSVM.md)\n5. [FsVM - команды](ru/Command.md)\n6. [FsVM - валидация](ru/Validation.md)\n7. [Gjallarhorn - базовые сведения](ru/IntroductionGjl.md)\n8. [Использование Gjallarhorn вместе с WPF](ru/GjlWpf.md)\n\n---------\n\n#### Введение\n\nДля написания полноценных `WPF` приложений на `F#` существует несколько подходов:\n\n1. Не использовать разметку `xaml`, а создавать графический интерфейс полностью на F#.\n2. Использовать `XamlReader` для разбора файлов разметки.\n3. Использовать `FsXaml` для работы с `.xaml` файлами.\n \nИ, конечно, есть еще вариант писать UI часть на C#, но здесь его в расчет брать не будем. \n\nВ качестве иллюстрации напишем стандартный `Hello World`, для этого создадим простое консольное приложение.\n\n*Примечание*\n\u003e Если вы создали консольное приложение в `VisualStudio`, то не забудьте изменить в настройках приложения тип выходных данных с консольного на Windows\n\nДобавим ссылки на следующие сборки:\n\n- WindowsBase.dll\n- PresentationCore.dll\n- PresentationFramework.dll\n\nТеперь используем базовые `WPF` элементы `Label` для отображения приветственной надписи и `Window` для окна вывода. \n\nВ результате код может выглядеть подобным образом (хотя здесь он и намеренно упрощен):\n\n```fsharp\nopen System\nopen System.Windows\nopen System.Windows.Controls\n\nlet label = Label(FontSize=30.0, Content=\"Привет, МИР!\")\nlet win = Window(Height=100.0, Width=240.0, Content=label)\n\n[\u003cSTAThread\u003e]\nApplication().Run win\n|\u003e ignore\n```\n\nДля второго способа усложним пример так, чтобы классическое сообщение выводилось при нажатии на кнопку.\n\n```fsharp\nopen System\nopen System.Windows\nopen System.Windows.Controls\nopen System.Windows.Markup\n\nlet windowXaml = \"\"\"\n\u003cWindow\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    Height = \"57\" Width = \"100\"\u003e\n    \u003cStackPanel\u003e\n        \u003cButton Name=\"HelloWorldButton\"\u003eТыц\u003c/Button\u003e\n    \u003c/StackPanel\u003e\n\u003c/Window\u003e\"\"\"\n\nlet win = XamlReader.Parse windowXaml :?\u003e Window\nlet button = win.FindName \"HelloWorldButton\" :?\u003e Button\n\nbutton.Click.Add\n    (fun _ -\u003e MessageBox.Show \"Привет, МИР!\" |\u003e ignore)\n\n[\u003cSTAThread\u003e]\nApplication().Run win\n|\u003e ignore\n```\n\nПодробнее о возможностях `XamlReader` можно узнать в [документации](https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.markup.xamlreader?view=netframework-4.7.2).\n\nТеперь о последнем из перечисленных подходов. [`FsXaml`](https://github.com/fsprojects/FsXaml) это поставщик типов (type provider) который служит для генерации F# - типов для наших XAML - файлов.\n\nДля добавления в проект через NuGet\n\n```powershell\nInstall-Package FsXaml.Wpf\n```\n\nили, если предпочитаете `paket`:\n\n```powershell\npaket add FsXaml.Wpf --version 3.1.6\n```\n\n*Примечание*\n\u003e В этом случае предварительный шаг делать не нужно, так как все требуемые ссылки на сборки будут автоматически добавлены при установке пакета, \n\nПример:\n\n```fsharp\nopen FsXaml\nopen System\nopen System.Windows\n\ntype MainWindowBase = XAML\u003c\"MainWindow.xaml\"\u003e\n\n[\u003cSTAThread\u003e]\nMainWindowBase() \n|\u003e Application().Run\n|\u003e ignore\n```\n\nЗдесь `MainWindow.xaml` файл с разметкой, который должен быть отмечен как ресурс.\n\nО преимуществах использования `FsXaml` над `XamlReader` можно прочитать [`тут`](http://stackoverflow.com/questions/30859148/advantage-of-fsxaml-type-provider-over-xamlreader)\n\n\nУ каждого из описанных выше подходов есть свои сильные стороны, но для относительно небольших приложений скорее всего удобнее будет использовать именно `FsXaml`. \n\n\n-------\n\n## Используемые версии библиотек ##\n\n- FsXaml.Wpf - **3.1.16**\n- FSharp.ViewModule - **1.0.5**\n- Gjallarhorn - **Gjallarhorn 0.0.9 (beta)**","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoggyfinder%2Ffsharpwpfnotes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoggyfinder%2Ffsharpwpfnotes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoggyfinder%2Ffsharpwpfnotes/lists"}