Marcação C# concisa de última geração para estruturas de UI .NET
C# Markup 2 oferece suporte a várias estruturas de UI, incluindo a excelente plataforma Uno.
Se você não conhece o Uno, recomendo que dê uma olhada; Uno é um dos melhores e mais maduros frameworks de UI .NET, ele oferece uma impressionante variedade de recursos que o apoiarão quando você precisar criar aplicativos de produção do mundo real de ponta a ponta, rapidamente .
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
A plataforma Uno oferece suporte a XAML, mas recentemente adotou a UI C# também com Uno C# Markup. C# Markup 2 adiciona outra opção que vai além do que as variantes de marcação C# da geração 1 oferecem.
É bom ter opções – todos ganham: os desenvolvedores obtêm a experiência que mais gostam e a estrutura da UI ganha mais adoção. Confira e escolha o que você gosta!
Como primeira impressão, aqui está uma rápida comparação lado a lado:
Desfrute de uma experiência de desenvolvimento de UI semelhante ao Flutter com C# Markup 2:
new
, HorizontalAlignment = HorizontalAlignment.Center
, () =>
ou nameof()
, chega de especificar para cada ligação TextBlock
que sim, você deseja vincular à propriedade Text
...MyPage.cs
, consulte a estrutura da UI e outras APIs ao editar MyPage.logic.cs
.Não é necessário XAML/HTML/JavaScript/CSS. Nenhum mecanismo ou camadas para atrapalhar.
NuGet
Bate-papo (se necessário, entre primeiro no DotNetEvolution)
O melhor lugar para tirar dúvidas ou ajudar!
Procurando marcação C# 1? Encontre aqui
7 de maio de 2024
Nova marcação C# 2.4 para plataforma Uno 5.2 incluindo projeto único .NET
O lançamento de hoje está totalmente atualizado para o Uno 5.2, incluindo o projeto único .NET do Uno e uno.sdk
!
Mais:
dotnet new unoapp
mais recente21 de dezembro de 2023
Novos modelos C# Markup 2 para Uno Platform 5
Além de alguns novos métodos C# Markup 2, a versão de hoje adiciona suporte para os novos modelos C# Markup 2 para Uno Platform 5: um modelo mcs-uno-markup2
atualizado e um novo modelo mcs-uno-view
.
dotnet new unoapp
do Uno ou com o assistente de solução Uno para Visual Studiomcs-uno-view
é usado pelo conveniente script New-View.ps1
, que está incluído em mcs-uno-markup2
18 de novembro de 2023
A versão 2.3 é GA - adiciona suporte para .NET 8, Uno 5 mais 5 bibliotecas Uno!
Esta versão está totalmente atualizada para a incrível versão Uno 5 e .NET 8 GA. Você pode usar o Uno Solution Wizard para Visual Studio e adicionar um projeto C# Markup 2 a ele a qualquer momento com um comando. Todas as personalizações do assistente Uno são suportadas: combine C# Markup 2 com MVUX ou MVVM, XAML ou Uno C# Markup, use extensões Uno Navigation e direcione .NET 8 ou .NET 7. Todas as plataformas de destino Uno são suportadas.
Um novo modelo de projeto dotnet C# Markup 2 ajuda você a começar rapidamente - cuidadosamente otimizado para uma experiência de desenvolvedor ideal: visualização organizada do explorador de soluções, agrupamento automático de arquivos de marcação e arquivos lógicos, fonte de marcação organizada, intellisense focado, pontos de partida claros para extensões de marcação em seu código, além de recarregamento a quente rápido - tanto automático quanto com uma sobreposição de botão de recarregamento a quente no modo de depuração, para as plataformas nas quais seu IDE pode recarregar a quente, mas (ainda) não pode atualizar o UI automaticamente.
Aproveite melhorias gerais do C# Markup 2, além de APIs C# Markup 2 para 5 bibliotecas Uno adicionais:
ThemeResource
pesquisáveis em C# intellisense, fortemente tipadosA introdução está totalmente atualizada. Os exemplos neste repositório e neste leia-me serão atualizados em breve para mostrar os novos recursos.
Marcação C# concisa NJoy!
1º de novembro de 2023
2.3 Preview Release adiciona 5 bibliotecas Uno!
Aproveite melhorias gerais do C# Markup 2, além de APIs C# Markup 2 para 5 bibliotecas Uno adicionais:
ThemeResource
pesquisáveis em C# intellisense, fortemente tipadosVocê pode tentar isso hoje – veja os NuGets listados acima. A documentação dos novos recursos e um novo guia de primeiros passos chegarão com o próximo lançamento - em breve!
27 de junho de 2023
2.2 Lançamento e início do suporte .NET MAUI
25 de março de 2023
Os resultados da enquete chegaram! E o vencedor é...
Os resultados da pesquisa de março de 2023 sobre o que construir a seguir para C# Markup 2 chegaram!
Uma adição surpresa foi a solicitação de C# Markup 2 para Avalonia UI nas respostas; obteve uma grande resposta que o catapultou para um 2º lugar muito próximo.
Aqui estão os resultados da enquete, incluindo curtidas para as opções "Outras" Blazor e AvaloniaUI:
E o vencedor é: C# Markup 2 para MAUI !
Assista e marque este repositório com estrela para ver o lançamento; você também pode assistir aos tweets #CSharpForMarkup para ver o progresso. Obrigado pela sua resposta!
28 de fevereiro de 2023
Lançamento principal - C# Markup 2 versão 2.0 para WinUI 3!
C# Markup 2 versão 2.0 para WinUI 3 está aqui! Completamente atualizado para .NET 7, C# 11 e o mais recente Windows App SDK e Uno Platform. Com muitas melhorias, incluindo 6 plataformas de destino suportadas, suporte a recarga dinâmica C# e novos modelos de projeto dotnet.
Trazido a você por Applicita
Agradecimentos especiais à Applicita por tornar este lançamento possível; é inspirador ver uma empresa apoiar OSS dessa forma (a Applicita também abre o código-fonte de várias outras bibliotecas úteis)
Mais sobre o que há de novo nesta versão aqui.
16 de fevereiro de 2023
Uma nova versão do C# Markup 2 para WinUI 3 e Uno Platform será lançada em fevereiro de 2023
Atualizado para .NET 7, C# 11 e o mais recente Windows App SDK e Uno Platform. Com muitas melhorias - incluindo suporte a hot reload C# e um novo modelo de projeto dotnet. Observe este espaço!
14 de abril de 2022
Nova versão 0.8: adiciona suporte
ControlTemplate
e melhoriasStyle
!
Veja aqui e aqui a lista completa de melhorias
15 de fevereiro de 2022
Nova versão 0.6: adiciona WPF e muitas melhorias!
Veja aqui a lista completa de melhorias
30 de novembro de 2021
Marcação C# 2 anunciada na UNOCONF 2021!
Esta primeira visualização é voltada para WinUI 3 e Uno Platform - incluindo webassembly de navegador - com C# 10 e .NET 6. Ela suporta .NET Hot Reload para um rápido loop de desenvolvimento interno.
Veja o anúncio do C# Markup 2 na UNOCONF 2021:
Build()
, Assign()
e Invoke()
.Primeiro verifique se o seu ambiente de desenvolvimento está pronto:
Escolha uma solução Uno Platform 5.2 existente ou crie uma nova com o Uno Platform Template Wizard ou o modelo dotnet new unoapp. Sinta-se à vontade para selecionar qualquer opção; C# Markup 2 oferece suporte total ao Uno 5.2 com .NET 8 ou .NET 7, MVUX ou MVVM, XAML ou Uno C# Markup, em todas as plataformas de destino.
Instale o Modern.CSharp.Templates mais recente para dotnet new
para obter esses modelos para Windows App SDK, Uno Platform e muito mais
dotnet new install Modern.CSharp.Templates
Para ver ajuda sobre os parâmetros do modelo:
dotnet new mcs-uno-markup2 -h
Adicione um projeto C# Markup 2 à solução Uno Platform, por exemplo:
cd C:ReposUnoApp1
dotnet new mcs-uno-markup2 --appRootNamespace InnoWvate.UnoApp1 --presentation mvux --allow-scripts Yes
Isto irá:
Adicione um novo projeto UnoApp1.Presentation
à solução, com um exemplo prático:
New-View.ps1
para adicionar rapidamente mais páginas e modelosReadme.md
com instruções sobre como começar rapidamenteO projeto de apresentação é pré-estruturado para manutenção de acordo com as práticas recomendadas para C# Markup UI
Adicione referências de pacote NuGet ao projeto de apresentação
Adicione uma referência ao projeto Presentation no projeto UnoApp1
Observe que você pode usar o parâmetro --name
de dotnet new
para especificar o nome do seu projeto Uno existente , se for diferente do nome da pasta da solução (no exemplo acima, UnoApp1
). O nome especificado também será usado com o sufixo .Presentation
para o novo projeto.
Abra ou recarregue a solução Uno e siga as etapas no Readme.md
do projeto Presentation para começar.
Para aprender como usar C# Markup 2, leia a descrição dos recursos abaixo.
Para um exemplo mais completo, consulte o aplicativo de exemplo neste repositório.
C# Markup 2 contém uma API declarativa completa e fluente para estruturas de UI existentes. Ele apresenta praticamente todos os layouts, visualizações e propriedades, incluindo propriedades anexadas, e inclui documentação in-line completa que vincula cada auxiliar/parâmetro de marcação à documentação in-line para o objeto/propriedade da UI subjacente.
As ricas estruturas de UI que o C# Markup 2 apresenta podem conter até mais de 500 tipos de objetos de UI . Por exemplo, layouts, visualizações e estilos, mas também pincéis, elementos de rich text, desenhos primitivos, transformações, animações, estados visuais e muito mais. Além disso, o C# Markup oferece APIs de conveniência poderosas e concisas para layout, ligações, conversores, modelos e muito mais.
Layouts, visualizações, propriedades e valores de propriedades são assim:
Todas as propriedades podem ser definidas com métodos de extensão: propriedades definidas no tipo de visualização ou em seus tipos base, bem como propriedades anexadas.
As propriedades definidas diretamente no tipo de visualização podem ser definidas alternativamente com parâmetros nomeados:
Isto é útil principalmente para propriedades que utilizam tipos primitivos.
Propriedades que aceitam valores enum possuem métodos de extensão para que o nome enum não precise ser repetido
(como em TextAlignment: TextAlignment.Center
):
Os nomes das propriedades anexadas são prefixados com o tipo de definição mais sublinhado:
Você pode definir vários valores de propriedade anexados para o mesmo tipo de definição em uma chamada :
Além disso, existem sobrecargas de conveniência para alguns tipos de visualização apenas com os parâmetros mais comumente usados:
Conversores implícitos são fornecidos no subnamespace to
para tipos de valores de propriedade comuns:
Estes são:
string
, conforme especificado pela estrutura da UI com o atributo TypeConverterstring
, incluindo tuplas se mais de um valor for esperado. Por exemplo: Button() .CornerRadius (2.5)
ouButton() .CornerRadius ((2.5, 0, 2.5, 0))
Um exemplo usando to.Point
:
Button ( ) . Background ( RadialGradientBrush ( Center : ( 50 , 50 ) , GradientOrigin : ( 100 , 50 ) ) )
Um exemplo usando to.TimeSpan
e to.Duration
:
ColorAnimation ( BeginTime : " 0:0:5 " , Duration : 2.5 )
Em muitos casos, a documentação embutida no arquivo to.
type descreve os valores e formatação suportados; especialmente para strings, isso pode evitar suposições.
Os estilos podem ser atribuídos assim:
E definido assim:
No WPF você pode vincular um valor configurador de estilo (o WinUI 3 não suporta isso):
Um DataTemplate
é passado como Func
:
Um ControlTemplate
pode ser criado assim:
.BindTemplate()
permite vincular propriedades do modelo ao pai do modelotargetType
é opcionalb
aqui está um campo static UI_Button
com valor nulo. Neste exemplo, serve apenas para demonstrar uma maneira de obter inteligência ao editar expressões de ligação para um Button
; consulte Poder de ligação para obter detalhes. Aqui está como você pode usar um ControlTemplate
em um Style
implícito ou explícito:
Você pode usar enumerações em vez de números para linhas e colunas da grade. Isso melhora a legibilidade e evita que você renumere manualmente linhas e colunas ao adicioná-las/remover/reordená-las.
Os auxiliares abreviados são incluídos como uma alternativa às combinações comuns de auxiliares de marcação:
Todos os layouts ignoram valores null
em seus children
; isso torna possível ter visualizações condicionais dependendo do valor de uma expressão no momento da (re)construção da página.
O helper Spread
permite inserir um número variável de filhos em uma posição específica na lista children
(semelhante ao que o Flutter oferece).
Graças ao atributo CallerArgumentExpression do C# 10, você não precisa usar strings ou nameof()
para especificar caminhos de ligação com bom desempenho . Em vez disso, você pode usar expressões C# e aproveitar todas as vantagens que elas trazem: intellisense completo, verificação do compilador, suporte para renomeação:
Observe na descrição do intellisense na imagem acima que o parâmetro pathExpression
suporta várias sintaxes de ligação de conveniência , o que permite:
viewmodel.path
|| (viewmodel expression).path
, onde path
pode conter .
por exemplo:.Bind (vm.SelectedTweet)
liga-se a "SelectedTweet".Bind ((vm.SelectedTweet).Title)
liga-se a "Título".Bind ((vm.SelectedTweet).Author.Name)
liga-se a "Author.Name"?
com instâncias de tipo com valor nulo para aproveitar as vantagens do C# sem precisar de instâncias de objeto, por exemplo:.Bind (vm?.SelectedTweet?.Title)
liga-se a "Título"?
pode ser necessário porque a expressão será avaliada em tempo de execução, mesmo que não nos importemos com seu valor; o atributo CallerArgumentExpression fornece uma cadeia de caracteres de expressão além do valor da expressão..Bind ("SelectedTweet")
liga-se a "SelectedTweet" Quaisquer caracteres "
, @
ou espaços em branco ao redor em pathExpression
são ignorados
Bind
oferece suporte a quase todas as funcionalidades que a estrutura de UI oferece para vinculação. Além disso, existem muitas sobrecargas Bind
que permitem:
Uma página de marcação típica começa assim:
FlutterPage.cs
:
using CSharpMarkup . < UI framework name > ;
using static CSharpMarkup . < UI framework name > . Helpers ;
namespace Examples ;
partial class FlutterPage
{
public void Build ( ) => Content =
Observe o uso da partial class
; isso permite separar a marcação da UI da lógica da UI :
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 ( ) ;
IMPORTANTE:
Em arquivos de marcação C# como
:
Inclui usos de namespace CSharpMarkup.*
mas nenhum uso de modelo de objeto de UI, como using Microsoft.UI.Xaml;
(por design, os nomes dos tipos no namespace CSharpMarkup são idênticos aos nomes dos tipos no modelo de objeto da UI, portanto, incluir ambos causaria ambiguidades)
Tente limitar o uso do modelo de objeto da UI aos arquivos lógicos da UI. Se necessário, você pode usar o modelo de objeto da UI com segurança em arquivos de marcação C#; uma boa prática é definir o namespace global usando aliases, por exemplo, global using UI = Microsoft.UI;
Para obter mais orientações, consulte os comentários no GlobalUsings.cs
de um projeto criado com dotnet new mcs-uno-markup2
.
Em arquivos lógicos de UI como
:
Não use objetos CSharpMarkup
Instâncias de objeto de marcação não são seguras para uso fora de uma expressão de marcação (devido a recursos de desempenho - cada tipo de objeto de marcação tem uma única instância estática para evitar a alocação de um objeto extra para cada visualização). É por isso que Assign
e Invoke
(veja abaixo) passam o objeto UI contido no objeto de marcação para a lógica, em vez do próprio objeto de marcação.
Com Assign
and Invoke
você pode integrar a marcação da UI com a lógica da UI:
SearchPage.cs
:
SearchPage.logic.cs
:
SearchPage.cs
:
SearchPage.logic.cs
:
Observação :
EmSearchPage.cs
,StackPanel
eTextBox
são tipos de objetos de marcação , enquanto
emSearchPage.logic.cs
eles são os tipos de objetos da estrutura de UI correspondentes
Não há extensão IDE de marcação C# (ainda...) para colorir adequadamente a marcação, no entanto, a legibilidade da marcação C# pode ser melhorada com esta solução alternativa nas opções do Visual Studio:
Em Fonts and Colors
, copie a cor de User Types - Classes
para User Members - Methods
(com o botão Custom...
). Agora a cor de marcação para visualizações e propriedades não será mais a mesma.