xaml-csharp-development-skill-for-avalonia

WinUI Text, RichTextBlock, Hyperlinks, and Rich Content to Avalonia

Table of Contents

  1. Scope and APIs
  2. Concept Mapping
  3. Conversion Example
  4. Migration Notes

Scope and APIs

Primary WinUI APIs:

Primary Avalonia APIs:

Concept Mapping

WinUI idiom Avalonia idiom
WinUI control/template/state pipeline Avalonia control theme/style/selector pipeline
x:Bind or {Binding} data flow {CompiledBinding ...} and typed x:DataType flow
WinUI layout/render invalidation model Avalonia InvalidateMeasure/InvalidateArrange/InvalidateVisual model

Conversion Example

WinUI XAML:

<Page
    x:Class="MyApp.Views.SamplePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyApp.Controls">
  <RichTextBlock><Paragraph><Run Text="Docs: " /><Hyperlink NavigateUri="https://example.com">Open</Hyperlink></Paragraph></RichTextBlock>
</Page>

WinUI C#:

var view = new RichTextBlock();

Avalonia XAML:

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="using:MyApp.ViewModels"
             xmlns:local="using:MyApp.Controls"
             x:DataType="vm:SampleViewModel">
  <TextBlock><Run Text="Docs: " /><Hyperlink NavigateUri="https://example.com">Open</Hyperlink></TextBlock>
</UserControl>

Avalonia C#:

var text = new TextBlock { Inlines = { new Run("Docs: "), new Hyperlink { NavigateUri = new Uri("https://example.com"), Inlines = { new Run("Open") } } } };

Migration Notes

  1. Start by porting behavior and state contracts first, then restyle and retune visuals.
  2. Prefer typed compiled bindings and avoid reflection-heavy dynamic binding paths.
  3. Keep UI-thread updates explicit when porting WinUI async/event flows.