Краткая разметка C# следующего поколения для инфраструктур пользовательского интерфейса .NET.
C# Markup 2 поддерживает несколько платформ пользовательского интерфейса, включая превосходную платформу Uno.
Если вы не знаете Уно, я рекомендую вам их проверить; Uno — одна из лучших и наиболее зрелых инфраструктур пользовательского интерфейса .NET. Она предлагает впечатляющий набор функций, которые пригодятся вам, когда вам нужно будет быстро создавать реальные производственные приложения.
dotnet new install Uno.Templates
dotnet new install Modern.CSharp.Templates
md UnoCSharpMarkup2
cd UnoCSharpMarkup2
dotnet new unoapp -preset recommended
dotnet new mcs-uno-markup2 --presentation mvux --allow-scripts yes
Платформа Uno поддерживает XAML, но недавно она также включила в себя пользовательский интерфейс C# с разметкой Uno C#. В C# Markup 2 добавлена еще одна опция, которая выходит за рамки того, что предлагают варианты C# Markup 1-го поколения.
Хорошо иметь варианты — выигрывают все: разработчики получают тот опыт, который им больше всего нравится, а инфраструктура пользовательского интерфейса получает большее распространение. Посмотрите и выберите то, что вам нравится!
Для первого впечатления, вот краткое сравнение:
Наслаждайтесь опытом разработки пользовательского интерфейса в стиле Flutter с помощью C# Markup 2:
new
, HorizontalAlignment = HorizontalAlignment.Center
, () =>
или nameof()
, больше не нужно указывать для каждой привязки TextBlock
, которую вы хотите привязать к свойству Text
...MyPage.cs
смотрите только API разметки. MyPage.cs
см. инфраструктуру пользовательского интерфейса и другие API при редактировании MyPage.logic.cs
.XAML/HTML/JavaScript/CSS не требуется. Никакого двигателя или слоев, которые могут вам помешать.
NuGet
Чат (при необходимости сначала присоединитесь к DotNetEvolution)
Лучшее место, чтобы задать вопросы или помочь!
Ищете разметку C# 1? Найдите это здесь
7 мая 2024 г.
Новая разметка C# 2.4 для платформы Uno 5.2, включая отдельный проект .NET
Сегодняшний выпуск полностью обновлен до версии Uno 5.2, включая единый проект Uno .NET и uno.sdk
!
Плюс:
dotnet new unoapp
21 декабря 2023 г.
Новые шаблоны разметки C# 2 для платформы Uno 5
В дополнение к некоторым новым методам C# Markup 2 в сегодняшнем выпуске добавлена поддержка новых шаблонов C# Markup 2 для Uno Platform 5: обновленный шаблон mcs-uno-markup2
и новый шаблон mcs-uno-view
.
dotnet new unoapp
Uno или с помощью мастера решений Uno для Visual Studio.mcs-uno-view
использует удобный скрипт New-View.ps1
, входящий в состав mcs-uno-markup2
18 ноября 2023 г.
Версия 2.3 общедоступная — добавлена поддержка .NET 8, Uno 5 и 5 библиотек Uno!
Этот выпуск полностью обновлен до великолепной версии Uno 5 и .NET 8 GA. Вы можете использовать Uno Solution Wizard для Visual Studio и добавить к нему проект C# Markup 2 в любое время с помощью одной команды. Поддерживаются все настройки мастера Uno: комбинируйте разметку C# 2 с разметкой MVUX или MVVM, XAML или разметкой Uno C#, используйте расширения Uno Navigation и ориентируйтесь на .NET 8 или .NET 7. Поддерживаются все целевые платформы Uno.
Совершенно новый шаблон проекта dotnet new C# Markup 2 поможет вам приступить к работе в кратчайшие сроки - тщательно оптимизирован для оптимального взаимодействия с разработчиком: лаконичный просмотр обозревателя решений, автоматическая группировка файлов разметки и логических файлов, лаконичный источник разметки, целенаправленный интеллектуальный анализ, четкие отправные точки для расширения разметки в вашем коде, а также быстрая горячая перезагрузка — как автоматическая, так и с наложением кнопки горячей перезагрузки в режиме отладки, для платформ, на которых ваша IDE может «горячую» перезагрузку, но не может (пока) обновить Пользовательский интерфейс автоматически.
Воспользуйтесь общими улучшениями C# Markup 2, а также API C# Markup 2 для 5 дополнительных библиотек Uno:
ThemeResource
доступны для поиска в C# intellisense, строго типизированы.Начало работы полностью актуально. Примеры в этом репозитории и в этом файле сведений скоро будут обновлены, чтобы продемонстрировать новые функции.
Радуйтесь лаконичной разметке C#!
1 ноября 2023 г.
Предварительная версия 2.3 добавляет 5 библиотек Uno!
Воспользуйтесь общими улучшениями C# Markup 2, а также API C# Markup 2 для 5 дополнительных библиотек Uno:
ThemeResource
доступны для поиска в C# intellisense, строго типизированы.Вы можете попробовать это сегодня — см. перечисленные выше NuGets. Документация по новым функциям и новое руководство по началу работы появятся в следующем выпуске — скоро!
27 июня 2023 г.
2.2 Выпуск и начало поддержки .NET MAUI
25 марта 2023 г.
Результаты голосования готовы! И победителем становится...
Результаты опроса, проведенного в марте 2023 года, о том, что делать дальше для C# Markup 2, уже готовы!
Неожиданным дополнением стал запрос на C# Markup 2 для пользовательского интерфейса Avalonia в ответах; он получил большой отклик, который позволил ему занять второе место.
Вот результаты опроса, включая лайки для опций «Другое» Blazor и AvaloniaUI:
И победителем стал: C# Markup 2 для MAUI !
Посмотрите и поставьте лайк этому репозиторию, чтобы не пропустить выпуск; вы также можете следить за прогрессом в твитах #CSharpForMarkup. Спасибо за ваш ответ!
28 февраля 2023 г.
Основной выпуск — разметка C# 2 версии 2.0 для WinUI 3!
C# Markup 2 версии 2.0 для WinUI 3 уже здесь! Полностью обновлено до .NET 7, C# 11, а также последней версии Windows App SDK и платформы Uno. Со множеством улучшений, включая 6 поддерживаемых целевых платформ, поддержку горячей перезагрузки C# и новые шаблоны проектов dotnet.
Предоставлено вам Applicita
Особая благодарность выражается Applicita за то, что этот выпуск стал возможным; воодушевляет то, что компания поддерживает OSS таким образом (Applicita также открыла исходный код нескольких других полезных библиотек)
Подробнее о том, что нового в этом выпуске, здесь.
16 февраля 2023 г.
Новый выпуск C# Markup 2 для WinUI 3 и платформы Uno выйдет в феврале 2023 г.
Обновлено до .NET 7, C# 11, а также последней версии Windows App SDK и платформы Uno. Со многими улучшениями, включая поддержку горячей перезагрузки C# и новый шаблон проекта dotnet. Следите за этим пространством!
14 апреля 2022 г.
Новая версия 0.8: добавлена поддержка
ControlTemplate
и улучшеныStyle
!
Полный список улучшений см. здесь и здесь.
15 февраля 2022 г.
Новая версия 0.6: добавлен WPF и множество улучшений!
Полный список улучшений смотрите здесь.
30 ноября 2021 г.
C# Markup 2 анонсирован на UNOCONF 2021!
Эта первая предварительная версия предназначена для WinUI 3 и платформы Uno, включая веб-сборку браузера, с C# 10 и .NET 6. Она поддерживает горячую перезагрузку .NET для быстрого внутреннего цикла разработки.
См. анонс C# Markup 2 на UNOCONF 2021:
Build()
, Assign()
и Invoke()
.Сначала проверьте, готова ли ваша среда разработки:
Либо выберите существующее решение Uno Platform 5.2, либо создайте новое с помощью мастера шаблонов платформы Uno или нового шаблона dotnet unoapp. Смело выбирайте любые варианты; Разметка C# 2 полностью поддерживает Uno 5.2 с .NET 8 или .NET 7, MVUX или MVVM, XAML или разметкой Uno C# на всех целевых платформах.
Установите последнюю версию Modern.CSharp.Templates for dotnet new
чтобы получить эти шаблоны для Windows App SDK, платформы Uno и других.
dotnet new install Modern.CSharp.Templates
Чтобы просмотреть справку о параметрах шаблона:
dotnet new mcs-uno-markup2 -h
Добавьте проект C# Markup 2 в решение Uno Platform, например:
cd C:ReposUnoApp1
dotnet new mcs-uno-markup2 --appRootNamespace InnoWvate.UnoApp1 --presentation mvux --allow-scripts Yes
Это будет:
Добавьте в решение новый проект UnoApp1.Presentation
с рабочим примером:
New-View.ps1
для быстрого добавления дополнительных страниц и моделей.Readme.md
с инструкциями о том, как быстро начать работу.Проект Presentation предварительно структурирован для удобства сопровождения в соответствии с лучшими практиками для пользовательского интерфейса разметки C#.
Добавьте ссылки на пакеты NuGet в проект Presentation.
Добавьте ссылку на проект Presentation в проект UnoApp1
.
Обратите внимание, что вы можете использовать параметр --name
dotnet new
, чтобы указать имя существующего проекта Uno, если оно отличается от имени папки решения (в приведенном выше примере — UnoApp1
). Указанное имя будет использоваться с суффиксом .Presentation
и для нового проекта.
Откройте или перезагрузите решение Uno и следуйте инструкциям в файле Readme.md
проекта Presentation, чтобы начать работу.
Чтобы узнать, как использовать C# Markup 2, прочтите описание функций ниже.
Более полный пример см. в примере приложения в этом репозитории.
C# Markup 2 содержит полный декларативный, гибкий API для существующих платформ пользовательского интерфейса. Он отображает практически каждый макет, представление и свойство, включая прикрепленные свойства, и включает полную встроенную документацию , которая связывает каждый помощник/параметр разметки со встроенной документацией для базового объекта/свойства пользовательского интерфейса.
Богатые платформы пользовательского интерфейса, доступные в C# Markup 2, могут содержать до 500+ типов объектов пользовательского интерфейса . Например, макеты, представления и стили, а также кисти, элементы форматированного текста, примитивы рисования, преобразования, анимация, визуальные состояния и многое другое. Кроме того, C# Markup предлагает мощные и лаконичные удобные API для макетирования, привязок, преобразователей, шаблонов и многого другого.
Макеты, представления, свойства и значения свойств выглядят следующим образом:
Все свойства могут быть установлены с помощью методов расширения: свойства, определенные для типа представления или его базовых типов, а также прикрепленные свойства.
Свойства, определенные непосредственно в типе представления, также могут быть установлены с помощью именованных параметров:
В основном это полезно для свойств, принимающих примитивные типы.
Свойства, принимающие значения перечисления, имеют методы расширения, поэтому имя перечисления не нужно повторять.
(как в TextAlignment: TextAlignment.Center
):
Имена прикрепленных свойств начинаются с определяющего типа и подчеркивания:
Вы можете установить несколько значений присоединенных свойств для одного и того же определяющего типа за один вызов :
В дополнение к этому существуют удобные перегрузки для некоторых типов представлений только с наиболее часто используемыми параметрами:
Неявные преобразователи предоставляются в подпространстве to
для общих типов значений свойств:
Это:
string
значения, указанные платформой пользовательского интерфейса с атрибутом TypeConverter.string
, включая кортежи, если ожидается более одного значения. Например: Button() .CornerRadius (2.5)
илиButton() .CornerRadius ((2.5, 0, 2.5, 0))
Пример использования to.Point
:
Button ( ) . Background ( RadialGradientBrush ( Center : ( 50 , 50 ) , GradientOrigin : ( 100 , 50 ) ) )
Пример использования to.TimeSpan
и to.Duration
:
ColorAnimation ( BeginTime : " 0:0:5 " , Duration : 2.5 )
Во многих случаях встроенная документация по файлу to.
тип описывает поддерживаемые значения и форматирование; особенно для строк, это позволяет избежать догадок.
Стили можно назначить следующим образом:
И определяется так:
В WPF вы можете привязать значение установщика стиля (WinUI 3 не поддерживает это):
DataTemplate
передается как Func
:
ControlTemplate
можно создать следующим образом:
.BindTemplate()
позволяет привязывать свойства шаблона к родительскому шаблону.targetType
не является обязательным.b
здесь — static UI_Button
с нулевым значением. В этом примере он служит только для демонстрации одного способа получения intellisense при редактировании выражений привязки для Button
; подробности см. в разделе «Связующая сила». Вот как вы можете использовать ControlTemplate
в неявном или явном Style
:
Вы можете использовать перечисления вместо чисел для строк и столбцов сетки. Это улучшает читаемость и избавляет вас от необходимости вручную перенумеровывать строки и столбцы при их добавлении/удалении/переупорядочении.
Сокращенные помощники включены в качестве альтернативы обычным комбинациям помощников разметки:
Все макеты игнорируют null
значения в своих children
; это позволяет иметь условные представления в зависимости от значения выражения во время (пере) сборки страницы.
Помощник Spread
позволяет вставлять переменное количество дочерних элементов в определенную позицию в списке children
(аналогично тому, что предлагает Flutter).
Благодаря атрибуту C# 10 CallerArgumentExpression вам не нужно использовать строки или nameof()
для указания путей привязки с хорошей производительностью . Вместо этого вы можете использовать выражения C# и наслаждаться всеми преимуществами, которые они приносят: полный интеллект, проверка компилятора, поддержка переименования:
Обратите внимание в описании intellisense на изображении выше, что параметр pathExpression
поддерживает несколько удобных синтаксисов привязки , что позволяет:
viewmodel.path
|| (viewmodel expression).path
, где path
может содержать .
например:.Bind (vm.SelectedTweet)
привязывается к «SelectedTweet»..Bind ((vm.SelectedTweet).Title)
привязывается к «Заголовку».Bind ((vm.SelectedTweet).Author.Name)
привязывается к «Author.Name»?
с экземплярами типов с нулевым значением, чтобы насладиться преимуществами C# без необходимости экземпляров объектов, например:.Bind (vm?.SelectedTweet?.Title)
привязывается к «Заголовку»?
может быть необходимо, поскольку выражение будет оцениваться во время выполнения, даже если нас не волнует его значение; Атрибут CallerArgumentExpression предоставляет строку выражения в дополнение к значению выражения..Bind ("SelectedTweet")
привязывается к "SelectedTweet" Любые окружающие символы "
, @
или пробелы в pathExpression
игнорируются.
Bind
поддерживает практически все функции, которые предлагает для привязки инфраструктура пользовательского интерфейса. Кроме того, существует множество перегрузок Bind
, которые позволяют:
Типичная страница разметки начинается так:
FlutterPage.cs
:
using CSharpMarkup . < UI framework name > ;
using static CSharpMarkup . < UI framework name > . Helpers ;
namespace Examples ;
partial class FlutterPage
{
public void Build ( ) => Content =
Обратите внимание на использование partial class
; это позволяет отделить разметку пользовательского интерфейса от логики пользовательского интерфейса :
FlutterPage.logic.cs
:
using < UI framework namespace > . Controls ;
namespace Examples ;
public sealed partial class FlutterPage : Page , IBuild
{
readonly FlutterViewModel vm ;
public FlutterPage ( )
{
InitializeComponent ( ) ; // Only needed for WinUI
DataContext = vm = < obtain viewmodel instance > ;
Build ( ) ;
ВАЖНЫЙ:
В файлах разметки C#, таких как
:
Включите использование пространства имен CSharpMarkup.*
но не используйте объектную модель пользовательского интерфейса, например using Microsoft.UI.Xaml;
(по дизайну имена типов в пространстве имен CSharpMarkup идентичны именам типов в объектной модели пользовательского интерфейса, поэтому включение обоих может привести к неоднозначности)
Попробуйте ограничить использование объектной модели пользовательского интерфейса файлами логики пользовательского интерфейса. При необходимости вы можете безопасно использовать объектную модель пользовательского интерфейса в файлах разметки C#; Тогда хорошей практикой является определение глобального пространства имен с использованием псевдонимов, например global using UI = Microsoft.UI;
Дополнительные инструкции см. в комментариях в файле GlobalUsings.cs
проекта, созданного с помощью dotnet new mcs-uno-markup2
.
В файлах логики пользовательского интерфейса , таких как
:
Не используйте объекты CSharpMarkup
Экземпляры объектов разметки небезопасно использовать вне выражения разметки (из-за особенностей производительности — каждый тип объекта разметки имеет один статический экземпляр, чтобы предотвратить выделение дополнительного объекта для каждого представления). Вот почему Assign
и Invoke
(см. ниже) передают логике объект пользовательского интерфейса, содержащийся в объекте разметки, а не сам объект разметки.
С помощью Assign
и Invoke
вы можете интегрировать разметку пользовательского интерфейса с логикой пользовательского интерфейса:
SearchPage.cs
:
SearchPage.logic.cs
:
SearchPage.cs
:
SearchPage.logic.cs
:
Примечание :
ВSearchPage.cs
StackPanel
иTextBox
являются типами объектов разметки , а
вSearchPage.logic.cs
они являются соответствующими типами объектов платформы пользовательского интерфейса.
Расширения IDE C# Markup (пока...) для правильной раскраски разметки не существует, однако читаемость разметки C# можно улучшить с помощью этого обходного пути в параметрах Visual Studio:
В разделе Fonts and Colors
скопируйте цвет User Types - Classes
в User Members - Methods
(с помощью кнопки Custom...
). Теперь цвет разметки для представлений и свойств больше не будет одинаковым.