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