Platform Support

PlusUi supports multiple platforms through a single codebase.


Supported Platforms

Platform Status Minimum Version NuGet Package
Windows โœ… Stable Windows 10 (1809+) PlusUi.desktop
macOS โœ… Stable macOS 11.0+ PlusUi.desktop
Linux โœ… Stable Ubuntu 20.04+ PlusUi.desktop
Android ๐Ÿงช Preview API 21 (Android 5.0+) PlusUi.droid
iOS ๐Ÿงช Preview iOS 14.0+ PlusUi.ios
Web (Blazor) ๐Ÿงช Preview Modern browsers PlusUi.web
Headless ๐Ÿงช Preview .NET 10 PlusUi.headless

Feature Matrix

Core Features

Feature Windows macOS Linux Android iOS Web Headless
Basic Controls โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Data Binding โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Navigation โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Popups/Dialogs โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Custom Fonts โœ… โœ… โœ… โœ… โœ… โœ… โœ…
SVG Icons โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Theming โœ… โœ… โœ… โœ… โœ… โœ… โœ…

Input Features

Feature Windows macOS Linux Android iOS Web Headless
Mouse Input โœ… โœ… โœ… N/A N/A โœ… N/A
Touch Input โœ… โœ… โœ… โœ… โœ… โœ… N/A
Keyboard Input โœ… โœ… โœ… โœ… โœ… โœ… N/A
Keyboard Shortcuts โœ… โœ… โœ… โš ๏ธ โš ๏ธ โœ… N/A
Scroll Wheel โœ… โœ… โœ… N/A N/A โœ… N/A
Stylus/Pen โœ… โœ… โš ๏ธ โœ… โœ… โš ๏ธ N/A

Advanced Features

Feature Windows macOS Linux Android iOS Web Headless
Hardware Acceleration โœ… โœ… โœ… โœ… โœ… โš ๏ธ N/A
High DPI Support โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Dark Mode Detection โœ… โœ… โš ๏ธ โœ… โœ… โœ… N/A
System Tray โœ… โœ… โœ… N/A N/A N/A N/A
File Dialogs โœ… โœ… โœ… โœ… โœ… โš ๏ธ N/A
Clipboard โœ… โœ… โœ… โœ… โœ… โœ… N/A
Drag and Drop โœ… โœ… โœ… โš ๏ธ โš ๏ธ โš ๏ธ N/A

Legend:

  • โœ… Fully supported
  • โš ๏ธ Partial support or platform limitations
  • N/A Not applicable to this platform

Platform-Specific Setup

Windows

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.desktop" Version="*" />
  </ItemGroup>
</Project>

macOS

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <RuntimeIdentifier>osx-arm64</RuntimeIdentifier> <!-- or osx-x64 -->
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.desktop" Version="*" />
  </ItemGroup>
</Project>

Linux

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.desktop" Version="*" />
  </ItemGroup>
</Project>

Note: Linux requires additional dependencies:

# Ubuntu/Debian
sudo apt install libfontconfig1 libfreetype6

# Fedora
sudo dnf install fontconfig freetype

Android

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0-android</TargetFramework>
    <ApplicationId>com.yourcompany.yourapp</ApplicationId>
    <ApplicationVersion>1</ApplicationVersion>
    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.droid" Version="*" />
  </ItemGroup>
</Project>

iOS

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0-ios</TargetFramework>
    <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.ios" Version="*" />
  </ItemGroup>
</Project>

Web (Blazor)

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.web" Version="*" />
  </ItemGroup>
</Project>

Headless

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="*" />
    <PackageReference Include="PlusUi.headless" Version="*" />
  </ItemGroup>
</Project>

Use cases for Headless:

  • Automated UI testing without a display
  • Server-side rendering and screenshot generation
  • CI/CD pipelines for visual regression testing
  • Batch processing of UI exports

Multi-Platform Project Structure

For targeting multiple platforms, use a shared project structure:

MyApp/
โ”œโ”€โ”€ MyApp.Core/              # Shared code
โ”‚   โ”œโ”€โ”€ ViewModels/
โ”‚   โ”œโ”€โ”€ Pages/
โ”‚   โ””โ”€โ”€ MyApp.Core.csproj
โ”œโ”€โ”€ MyApp.Windows/
โ”‚   โ””โ”€โ”€ MyApp.Windows.csproj
โ”œโ”€โ”€ MyApp.Mac/
โ”‚   โ””โ”€โ”€ MyApp.Mac.csproj
โ”œโ”€โ”€ MyApp.Android/
โ”‚   โ””โ”€โ”€ MyApp.Android.csproj
โ””โ”€โ”€ MyApp.iOS/
    โ””โ”€โ”€ MyApp.iOS.csproj

Shared Project

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PlusUi.core" Version="1.0.0" />
  </ItemGroup>
</Project>

Platform Project

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\MyApp.Core\MyApp.Core.csproj" />
    <PackageReference Include="PlusUi.desktop" Version="*" />
  </ItemGroup>
</Project>

Platform Detection

// Check current platform at runtime
if (PlatformInfo.IsWindows)
{
    // Windows-specific code
}
else if (PlatformInfo.IsMacOS)
{
    // macOS-specific code
}
else if (PlatformInfo.IsAndroid)
{
    // Android-specific code
}
else if (PlatformInfo.IsIOS)
{
    // iOS-specific code
}

// Or use the platform enum
switch (PlatformInfo.Current)
{
    case Platform.Windows:
        break;
    case Platform.MacOS:
        break;
    case Platform.Linux:
        break;
    case Platform.Android:
        break;
    case Platform.iOS:
        break;
    case Platform.Web:
        break;
}

Known Platform Limitations

Web (Blazor)

  • No native file system access (uses browser APIs)
  • Limited drag-and-drop support
  • Hardware acceleration depends on browser WebGL support

Mobile (Android/iOS)

  • Keyboard shortcuts work only with external keyboards
  • System tray not available
  • Some gestures may conflict with OS navigation

Linux

  • Dark mode detection depends on desktop environment
  • Stylus support varies by distribution and hardware

Headless

  • No user input (designed for server-side rendering)
  • No window or display output
  • Ideal for automated testing, screenshot generation, and CI/CD pipelines

Back to top

PlusUi is licensed under the MIT License.