brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
uno-platformBuild cross-platform .NET applications with Uno Platform targeting WebAssembly, iOS, Android, macOS, Linux, and Windows from a single XAML/C# codebase. USE FOR: building cross-platform apps from a single C# and XAML codebase; targeting WebAssembly, iOS, Android, macOS, Linux, and Windows simultaneously; migrating WPF or UWP. DO NOT USE FOR: unrelated stacks…
Independent GitHub snapshot · Automated classification · Original documentation governs
See detailed examples in the references/ folder:
patterns.md — MVUX, XAML, navigation, and performance patterns| Platform | Rendering | Notes |
|---|---|---|
| Windows | WinUI 3 | Native Windows App SDK |
| WebAssembly | Skia/Canvas | Runs in browser |
| iOS | Skia/Metal | Native iOS app |
| Android | Skia/OpenGL | Native Android app |
| macOS | Skia/Metal | Mac Catalyst or AppKit |
| Linux | Skia/X11 | GTK or Framebuffer |
MyApp/
├── MyApp/ # Shared code
│ ├── App.xaml # Application entry
│ ├── MainPage.xaml # Main page
│ ├── Presentation/ # ViewModels (MVUX/MVVM)
│ ├── Business/ # Business logic
│ └── Services/ # Platform services
├── MyApp.Wasm/ # WebAssembly head
├── MyApp.Mobile/ # iOS and Android head
├── MyApp.Skia.Gtk/ # Linux head
├── MyApp.Skia.WPF/ # Windows Skia head
└── MyApp.Windows/ # Native WinUI head
public partial record MainModel
{
public IListFeed<TodoItem> Items => ListFeed.Async(LoadItems);
private async ValueTask<IImmutableList<TodoItem>> LoadItems(CancellationToken ct)
{
var items = await _todoService.GetAllAsync(ct);
return items.ToImmutableList();
}
}
<Page xmlns:uen="using:Uno.Extensions.Navigation.UI">
<utu:FeedView Source="{Binding Items}">
<utu:FeedView.ValueTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:TodoItem">
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</utu:FeedView.ValueTemplate>
<utu:FeedView.ProgressTemplate>
<DataTemplate>
<ProgressRing IsActive="True" />
</DataTemplate>
</utu:FeedView.ProgressTemplate>
</utu:FeedView>
</Page>
public partial class MainViewModel(ITodoService todoService) : ObservableObject
{
[ObservableProperty]
private ObservableCollection<TodoItem> _items = [];
[ObservableProperty]
private bool _isLoading;
[RelayCommand]
private async Task LoadItemsAsync()
{
IsLoading = true;
try
{
var items = await todoService.GetAllAsync();
Items = new ObservableCollection<TodoItem>(items);
}
finally
{
IsLoading = false;
}
}
}
<TextBlock Text="Welcome"
xmlns:win="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:android="http://uno.ui/android"
xmlns:ios="http://uno.ui/ios"
xmlns:wasm="http://uno.ui/wasm">
<win:TextBlock.Foreground>
<SolidColorBrush Color="Blue" />
</win:TextBlock.Foreground>
<android:TextBlock.Foreground>
<SolidColorBrush Color="Green" />
</android:TextBlock.Foreground>
</TextBlock>
// Services/DeviceService.cs (shared)
public partial class DeviceService
{
public partial string GetDeviceInfo();
}
// Services/DeviceService.wasm.cs
public partial class DeviceService
{
public partial string GetDeviceInfo() => "WebAssembly";
}
// Services/DeviceService.Android.cs
public partial class DeviceService
{
public partial string GetDeviceInfo() =>
quot;Android {Android.OS.Build.VERSION.Release}";
}
// Enable Hot Reload in App.xaml.cs
public App()
{
this.InitializeComponent();
#if DEBUG
// Enable Hot Reload
this.EnableHotReload();
#endif
}
| Anti-Pattern | Why It's Bad | Better Approach |
|---|---|---|
| Platform code in shared | Breaks compilation | Use partial classes or #if |
| Ignoring Skia differences | Visual bugs | Test on all renderers |
| WPF assumptions | Not all APIs exist | Check Uno API coverage |
| Heavy XAML | Slow on WASM | Virtualize, simplify |
| Synchronous loading | UI freezes | Always use async |
Use virtualized lists:
<ListView ItemsSource="{Binding Items}"
VirtualizingPanel.VirtualizationMode="Recycling" />
Lazy load resources:
// Load images on demand
var image = await ImageSource.LoadFromUriAsync(uri);
Minimize XAML complexity:
x:Bind where supported)WebAssembly specific:
InvokeAsync for JS interop// Use Uno.Extensions for enhanced patterns
var builder = this.CreateBuilder(args)
.Configure(host => host
.UseConfiguration()
.UseLocalization()
.UseNavigation()
.UseMvux()
.ConfigureServices(services =>
{
services.AddSingleton<ITodoService, TodoService>();
}));