Add control gallery sample and roadmap documentation
- Add comprehensive ControlGallery sample app with 12 pages demonstrating all 35+ controls - Add detailed ROADMAP.md with version milestones - Add README placeholders for VSIX icons and template images - Sample pages include: Home, Buttons, Labels, Entry, Pickers, Sliders, Toggles, Progress, Images, CollectionView, CarouselView, SwipeView, RefreshView 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
1d9338d823
commit
f945d2a537
|
|
@ -0,0 +1,96 @@
|
||||||
|
# OpenMaui Linux Platform Roadmap
|
||||||
|
|
||||||
|
This document outlines the development roadmap for the OpenMaui Linux platform.
|
||||||
|
|
||||||
|
## Version 1.0 (Current - Preview)
|
||||||
|
|
||||||
|
### Completed Features ✅
|
||||||
|
|
||||||
|
| Feature | Status | Description |
|
||||||
|
|---------|--------|-------------|
|
||||||
|
| Core Control Library | ✅ Complete | 35+ controls including Button, Label, Entry, etc. |
|
||||||
|
| SkiaSharp Rendering | ✅ Complete | Hardware-accelerated 2D graphics |
|
||||||
|
| X11 Support | ✅ Complete | Full X11 display server integration |
|
||||||
|
| Platform Services | ✅ Complete | Clipboard, file picker, notifications, etc. |
|
||||||
|
| Accessibility (AT-SPI2) | ✅ Complete | Screen reader support |
|
||||||
|
| Input Methods | ✅ Complete | IBus and XIM support |
|
||||||
|
| High DPI Support | ✅ Complete | Automatic scale factor detection |
|
||||||
|
| Drag and Drop | ✅ Complete | XDND protocol implementation |
|
||||||
|
| Global Hotkeys | ✅ Complete | System-wide keyboard shortcuts |
|
||||||
|
| XAML Support | ✅ Complete | Standard .NET MAUI XAML syntax |
|
||||||
|
| Project Templates | ✅ Complete | Code and XAML-based templates |
|
||||||
|
| Visual Studio Extension | ✅ Complete | Project templates and launch profiles |
|
||||||
|
|
||||||
|
## Version 1.1 (Next Release)
|
||||||
|
|
||||||
|
### In Progress 🚧
|
||||||
|
|
||||||
|
| Feature | Priority | Description |
|
||||||
|
|---------|----------|-------------|
|
||||||
|
| Complete Wayland Support | High | Full Wayland compositor support |
|
||||||
|
| XAML Hot Reload | High | Live XAML editing during debugging |
|
||||||
|
| Performance Optimizations | Medium | Rendering and memory improvements |
|
||||||
|
|
||||||
|
### Planned 📋
|
||||||
|
|
||||||
|
| Feature | Priority | Description |
|
||||||
|
|---------|----------|-------------|
|
||||||
|
| Hardware Video Acceleration | Medium | VA-API/VDPAU integration |
|
||||||
|
| Live Visual Tree | Medium | Debug tool for inspecting UI hierarchy |
|
||||||
|
| Theming Improvements | Medium | Better system theme integration |
|
||||||
|
|
||||||
|
## Version 1.2 (Future)
|
||||||
|
|
||||||
|
### Planned 📋
|
||||||
|
|
||||||
|
| Feature | Priority | Description |
|
||||||
|
|---------|----------|-------------|
|
||||||
|
| GTK4 Interop Layer | Low | Native GTK dialog support |
|
||||||
|
| WebView Control | Medium | Embedded web browser support |
|
||||||
|
| Maps Integration | Low | OpenStreetMap-based mapping |
|
||||||
|
| Printing Support | Medium | CUPS printing integration |
|
||||||
|
|
||||||
|
## Version 2.0 (Long-term)
|
||||||
|
|
||||||
|
### Vision 🔮
|
||||||
|
|
||||||
|
| Feature | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| Vulkan Rendering | Next-gen graphics API support |
|
||||||
|
| Flatpak Packaging | Easy distribution via Flatpak |
|
||||||
|
| Snap Packaging | Ubuntu Snap store support |
|
||||||
|
| AppImage Support | Portable Linux app format |
|
||||||
|
| Multi-window Support | Multiple top-level windows |
|
||||||
|
| System Tray Menus | Rich tray icon interactions |
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We welcome contributions! Priority areas:
|
||||||
|
|
||||||
|
1. **Wayland Support** - Help complete the Wayland backend
|
||||||
|
2. **Testing** - Integration tests on various distributions
|
||||||
|
3. **Documentation** - API docs and tutorials
|
||||||
|
4. **Controls** - Additional control implementations
|
||||||
|
5. **Samples** - Real-world demo applications
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for details.
|
||||||
|
|
||||||
|
## Milestones
|
||||||
|
|
||||||
|
| Milestone | Target | Status |
|
||||||
|
|-----------|--------|--------|
|
||||||
|
| v1.0.0-preview.1 | Q1 2025 | ✅ Released |
|
||||||
|
| v1.0.0-preview.2 | Q1 2025 | ✅ Released |
|
||||||
|
| v1.0.0 | Q2 2025 | 🚧 In Progress |
|
||||||
|
| v1.1.0 | Q3 2025 | 📋 Planned |
|
||||||
|
| v1.2.0 | Q4 2025 | 📋 Planned |
|
||||||
|
|
||||||
|
## Feedback
|
||||||
|
|
||||||
|
- GitHub Issues: https://github.com/open-maui/maui-linux/issues
|
||||||
|
- Discussions: https://github.com/open-maui/maui-linux/discussions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Last updated: January 2025*
|
||||||
|
*Copyright 2025 MarketAlly LLC*
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.App">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<Color x:Key="Primary">#512BD4</Color>
|
||||||
|
<Color x:Key="PrimaryDark">#3B1F9E</Color>
|
||||||
|
<Color x:Key="Secondary">#DFD8F7</Color>
|
||||||
|
<Color x:Key="Tertiary">#2B0B98</Color>
|
||||||
|
<Color x:Key="Gray100">#E1E1E1</Color>
|
||||||
|
<Color x:Key="Gray200">#C8C8C8</Color>
|
||||||
|
<Color x:Key="Gray300">#ACACAC</Color>
|
||||||
|
<Color x:Key="Gray400">#919191</Color>
|
||||||
|
<Color x:Key="Gray500">#6E6E6E</Color>
|
||||||
|
<Color x:Key="Gray600">#404040</Color>
|
||||||
|
<Color x:Key="Gray900">#212121</Color>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace ControlGallery;
|
||||||
|
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
MainPage = new AppShell();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
xmlns:pages="clr-namespace:ControlGallery.Pages"
|
||||||
|
x:Class="ControlGallery.AppShell"
|
||||||
|
Title="OpenMaui Control Gallery">
|
||||||
|
|
||||||
|
<FlyoutItem Title="Home" Icon="home.png">
|
||||||
|
<ShellContent Title="Home" ContentTemplate="{DataTemplate pages:HomePage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
<FlyoutItem Title="Basic Controls" Icon="controls.png">
|
||||||
|
<ShellContent Title="Buttons" ContentTemplate="{DataTemplate pages:ButtonsPage}" />
|
||||||
|
<ShellContent Title="Labels" ContentTemplate="{DataTemplate pages:LabelsPage}" />
|
||||||
|
<ShellContent Title="Entry & Editor" ContentTemplate="{DataTemplate pages:EntryPage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
<FlyoutItem Title="Selection Controls" Icon="selection.png">
|
||||||
|
<ShellContent Title="Pickers" ContentTemplate="{DataTemplate pages:PickersPage}" />
|
||||||
|
<ShellContent Title="Sliders" ContentTemplate="{DataTemplate pages:SlidersPage}" />
|
||||||
|
<ShellContent Title="Toggles" ContentTemplate="{DataTemplate pages:TogglesPage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
<FlyoutItem Title="Display Controls" Icon="display.png">
|
||||||
|
<ShellContent Title="Progress" ContentTemplate="{DataTemplate pages:ProgressPage}" />
|
||||||
|
<ShellContent Title="Images" ContentTemplate="{DataTemplate pages:ImagesPage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
<FlyoutItem Title="Collections" Icon="list.png">
|
||||||
|
<ShellContent Title="CollectionView" ContentTemplate="{DataTemplate pages:CollectionViewPage}" />
|
||||||
|
<ShellContent Title="CarouselView" ContentTemplate="{DataTemplate pages:CarouselViewPage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
<FlyoutItem Title="Gestures" Icon="gesture.png">
|
||||||
|
<ShellContent Title="SwipeView" ContentTemplate="{DataTemplate pages:SwipeViewPage}" />
|
||||||
|
<ShellContent Title="RefreshView" ContentTemplate="{DataTemplate pages:RefreshViewPage}" />
|
||||||
|
</FlyoutItem>
|
||||||
|
|
||||||
|
</Shell>
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace ControlGallery;
|
||||||
|
|
||||||
|
public partial class AppShell : Shell
|
||||||
|
{
|
||||||
|
public AppShell()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>ControlGallery</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="OpenMaui.Controls.Linux" Version="1.0.0-preview.*" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<MauiXaml Include="**/*.xaml" />
|
||||||
|
<MauiImage Include="Resources\Images\*" />
|
||||||
|
<MauiFont Include="Resources\Fonts\*" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
using Microsoft.Maui.Hosting;
|
||||||
|
using OpenMaui.Platform.Linux.Hosting;
|
||||||
|
|
||||||
|
namespace ControlGallery;
|
||||||
|
|
||||||
|
public static class MauiProgram
|
||||||
|
{
|
||||||
|
public static MauiApp CreateMauiApp()
|
||||||
|
{
|
||||||
|
var builder = MauiApp.CreateBuilder();
|
||||||
|
builder
|
||||||
|
.UseMauiApp<App>()
|
||||||
|
.UseOpenMauiLinux()
|
||||||
|
.ConfigureFonts(fonts =>
|
||||||
|
{
|
||||||
|
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
|
||||||
|
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
|
||||||
|
});
|
||||||
|
|
||||||
|
return builder.Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.ButtonsPage"
|
||||||
|
Title="Buttons">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Button Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Basic Button -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Basic Button" FontAttributes="Bold" />
|
||||||
|
<Button Text="Click Me" Clicked="OnButtonClicked" />
|
||||||
|
<Label x:Name="ButtonResultLabel" Text="Button not clicked yet" TextColor="{StaticResource Gray400}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Styled Buttons -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Styled Buttons" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<Button Text="Primary" BackgroundColor="{StaticResource Primary}" TextColor="White" />
|
||||||
|
<Button Text="Secondary" BackgroundColor="{StaticResource Secondary}" TextColor="{StaticResource Primary}" />
|
||||||
|
<Button Text="Tertiary" BackgroundColor="{StaticResource Tertiary}" TextColor="White" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Button States -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Button States" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<Button Text="Normal" />
|
||||||
|
<Button Text="Disabled" IsEnabled="False" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- ImageButton -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="ImageButton" FontAttributes="Bold" />
|
||||||
|
<Label Text="ImageButton combines image and button functionality" TextColor="{StaticResource Gray500}" />
|
||||||
|
<ImageButton Source="dotnet_bot.png"
|
||||||
|
WidthRequest="100"
|
||||||
|
HeightRequest="100"
|
||||||
|
BackgroundColor="{StaticResource Gray100}"
|
||||||
|
CornerRadius="10"
|
||||||
|
Clicked="OnImageButtonClicked" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Corner Radius -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Corner Radius" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<Button Text="Square" CornerRadius="0" />
|
||||||
|
<Button Text="Rounded" CornerRadius="8" />
|
||||||
|
<Button Text="Pill" CornerRadius="20" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class ButtonsPage : ContentPage
|
||||||
|
{
|
||||||
|
private int _clickCount = 0;
|
||||||
|
|
||||||
|
public ButtonsPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnButtonClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_clickCount++;
|
||||||
|
ButtonResultLabel.Text = $"Button clicked {_clickCount} time(s)";
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnImageButtonClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("ImageButton", "You clicked the ImageButton!", "OK");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.CarouselViewPage"
|
||||||
|
Title="CarouselView">
|
||||||
|
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="CarouselView" FontSize="24" FontAttributes="Bold" />
|
||||||
|
<Label Text="Swipe left or right to navigate" TextColor="{StaticResource Gray500}" />
|
||||||
|
|
||||||
|
<CarouselView x:Name="Carousel"
|
||||||
|
HeightRequest="300"
|
||||||
|
Loop="True"
|
||||||
|
CurrentItemChanged="OnCurrentItemChanged">
|
||||||
|
<CarouselView.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Frame Margin="20" Padding="0" CornerRadius="20" HasShadow="True">
|
||||||
|
<Grid BackgroundColor="{Binding Color}">
|
||||||
|
<VerticalStackLayout VerticalOptions="Center" HorizontalOptions="Center" Spacing="10">
|
||||||
|
<Label Text="{Binding Icon}"
|
||||||
|
FontSize="64"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
<Label Text="{Binding Title}"
|
||||||
|
FontSize="28"
|
||||||
|
FontAttributes="Bold"
|
||||||
|
TextColor="White"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
<Label Text="{Binding Description}"
|
||||||
|
FontSize="16"
|
||||||
|
TextColor="White"
|
||||||
|
Opacity="0.8"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Grid>
|
||||||
|
</Frame>
|
||||||
|
</DataTemplate>
|
||||||
|
</CarouselView.ItemTemplate>
|
||||||
|
</CarouselView>
|
||||||
|
|
||||||
|
<IndicatorView x:Name="CarouselIndicator"
|
||||||
|
HorizontalOptions="Center"
|
||||||
|
IndicatorColor="{StaticResource Gray300}"
|
||||||
|
SelectedIndicatorColor="{StaticResource Primary}" />
|
||||||
|
|
||||||
|
<Label x:Name="CurrentItemLabel"
|
||||||
|
Text="Slide 1 of 5"
|
||||||
|
HorizontalOptions="Center"
|
||||||
|
TextColor="{StaticResource Gray500}" />
|
||||||
|
|
||||||
|
<HorizontalStackLayout HorizontalOptions="Center" Spacing="20">
|
||||||
|
<Button Text="Previous" Clicked="OnPreviousClicked" />
|
||||||
|
<Button Text="Next" Clicked="OnNextClicked" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class CarouselViewPage : ContentPage
|
||||||
|
{
|
||||||
|
private readonly List<CarouselItem> _items;
|
||||||
|
|
||||||
|
public CarouselViewPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
_items = new List<CarouselItem>
|
||||||
|
{
|
||||||
|
new() { Title = "Welcome", Description = "Get started with OpenMaui", Icon = "👋", Color = Color.FromArgb("#512BD4") },
|
||||||
|
new() { Title = "Controls", Description = "35+ beautiful controls", Icon = "🎨", Color = Color.FromArgb("#2196F3") },
|
||||||
|
new() { Title = "Native", Description = "X11 & Wayland support", Icon = "🐧", Color = Color.FromArgb("#4CAF50") },
|
||||||
|
new() { Title = "Fast", Description = "Hardware accelerated", Icon = "⚡", Color = Color.FromArgb("#FF9800") },
|
||||||
|
new() { Title = "Accessible", Description = "Screen reader support", Icon = "♿", Color = Color.FromArgb("#9C27B0") },
|
||||||
|
};
|
||||||
|
|
||||||
|
Carousel.ItemsSource = _items;
|
||||||
|
Carousel.IndicatorView = CarouselIndicator;
|
||||||
|
|
||||||
|
UpdateCurrentItemLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCurrentItemChanged(object sender, CurrentItemChangedEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateCurrentItemLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCurrentItemLabel()
|
||||||
|
{
|
||||||
|
var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
|
||||||
|
CurrentItemLabel.Text = $"Slide {index + 1} of {_items.Count}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPreviousClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
|
||||||
|
if (index > 0)
|
||||||
|
{
|
||||||
|
Carousel.ScrollTo(index - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Carousel.ScrollTo(_items.Count - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNextClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
|
||||||
|
if (index < _items.Count - 1)
|
||||||
|
{
|
||||||
|
Carousel.ScrollTo(index + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Carousel.ScrollTo(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CarouselItem
|
||||||
|
{
|
||||||
|
public string Title { get; set; } = string.Empty;
|
||||||
|
public string Description { get; set; } = string.Empty;
|
||||||
|
public string Icon { get; set; } = string.Empty;
|
||||||
|
public Color Color { get; set; } = Colors.Gray;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.CollectionViewPage"
|
||||||
|
Title="CollectionView">
|
||||||
|
|
||||||
|
<Grid RowDefinitions="Auto,*">
|
||||||
|
|
||||||
|
<VerticalStackLayout Padding="20" Spacing="10">
|
||||||
|
<Label Text="CollectionView" FontSize="24" FontAttributes="Bold" />
|
||||||
|
<Label Text="Displaying a list of items with custom templates" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
|
||||||
|
<CollectionView Grid.Row="1" x:Name="ItemsCollection" SelectionMode="Single" SelectionChanged="OnSelectionChanged">
|
||||||
|
<CollectionView.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Frame Margin="10,5" Padding="15" CornerRadius="8">
|
||||||
|
<Grid ColumnDefinitions="50,*,Auto">
|
||||||
|
<BoxView WidthRequest="40"
|
||||||
|
HeightRequest="40"
|
||||||
|
Color="{Binding Color}"
|
||||||
|
CornerRadius="20" />
|
||||||
|
|
||||||
|
<VerticalStackLayout Grid.Column="1" Margin="15,0" VerticalOptions="Center">
|
||||||
|
<Label Text="{Binding Title}" FontAttributes="Bold" />
|
||||||
|
<Label Text="{Binding Description}" TextColor="{StaticResource Gray500}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
|
||||||
|
<Label Grid.Column="2"
|
||||||
|
Text="{Binding Price, StringFormat='{0:C}'}"
|
||||||
|
FontAttributes="Bold"
|
||||||
|
VerticalOptions="Center" />
|
||||||
|
</Grid>
|
||||||
|
</Frame>
|
||||||
|
</DataTemplate>
|
||||||
|
</CollectionView.ItemTemplate>
|
||||||
|
|
||||||
|
<CollectionView.EmptyView>
|
||||||
|
<VerticalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
|
||||||
|
<Label Text="No items found" FontSize="18" TextColor="{StaticResource Gray400}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</CollectionView.EmptyView>
|
||||||
|
</CollectionView>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class CollectionViewPage : ContentPage
|
||||||
|
{
|
||||||
|
public CollectionViewPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
var items = new List<ItemModel>
|
||||||
|
{
|
||||||
|
new() { Title = "Product A", Description = "High quality item", Price = 29.99m, Color = Colors.Purple },
|
||||||
|
new() { Title = "Product B", Description = "Best seller", Price = 49.99m, Color = Colors.Blue },
|
||||||
|
new() { Title = "Product C", Description = "New arrival", Price = 19.99m, Color = Colors.Green },
|
||||||
|
new() { Title = "Product D", Description = "Limited edition", Price = 99.99m, Color = Colors.Orange },
|
||||||
|
new() { Title = "Product E", Description = "Customer favorite", Price = 39.99m, Color = Colors.Red },
|
||||||
|
new() { Title = "Product F", Description = "Eco-friendly", Price = 24.99m, Color = Colors.Teal },
|
||||||
|
new() { Title = "Product G", Description = "Premium quality", Price = 79.99m, Color = Colors.Indigo },
|
||||||
|
new() { Title = "Product H", Description = "Budget friendly", Price = 9.99m, Color = Colors.Pink },
|
||||||
|
};
|
||||||
|
|
||||||
|
ItemsCollection.ItemsSource = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.CurrentSelection.FirstOrDefault() is ItemModel item)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Selected", $"You selected {item.Title}", "OK");
|
||||||
|
((CollectionView)sender).SelectedItem = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ItemModel
|
||||||
|
{
|
||||||
|
public string Title { get; set; } = string.Empty;
|
||||||
|
public string Description { get; set; } = string.Empty;
|
||||||
|
public decimal Price { get; set; }
|
||||||
|
public Color Color { get; set; } = Colors.Gray;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.EntryPage"
|
||||||
|
Title="Entry & Editor">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Text Input Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Basic Entry -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Basic Entry" FontAttributes="Bold" />
|
||||||
|
<Entry Placeholder="Enter text here..." />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Entry with Binding -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Two-Way Binding" FontAttributes="Bold" />
|
||||||
|
<Entry x:Name="BoundEntry" Placeholder="Type something..." TextChanged="OnEntryTextChanged" />
|
||||||
|
<Label x:Name="BoundLabel" Text="You typed: " TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Password Entry -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Password Entry" FontAttributes="Bold" />
|
||||||
|
<Entry Placeholder="Enter password..." IsPassword="True" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Keyboard Types -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Keyboard Types" FontAttributes="Bold" />
|
||||||
|
<Entry Placeholder="Email" Keyboard="Email" />
|
||||||
|
<Entry Placeholder="Numeric" Keyboard="Numeric" />
|
||||||
|
<Entry Placeholder="Telephone" Keyboard="Telephone" />
|
||||||
|
<Entry Placeholder="URL" Keyboard="Url" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Max Length -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Max Length (10 characters)" FontAttributes="Bold" />
|
||||||
|
<Entry Placeholder="Max 10 chars" MaxLength="10" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Editor (Multiline) -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Editor (Multiline)" FontAttributes="Bold" />
|
||||||
|
<Editor Placeholder="Enter multiple lines of text..."
|
||||||
|
HeightRequest="100"
|
||||||
|
AutoSize="TextChanges" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Read-Only -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Read-Only Entry" FontAttributes="Bold" />
|
||||||
|
<Entry Text="This text cannot be edited" IsReadOnly="True" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class EntryPage : ContentPage
|
||||||
|
{
|
||||||
|
public EntryPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnEntryTextChanged(object sender, TextChangedEventArgs e)
|
||||||
|
{
|
||||||
|
BoundLabel.Text = $"You typed: {e.NewTextValue}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.HomePage"
|
||||||
|
Title="OpenMaui Control Gallery">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="30">
|
||||||
|
|
||||||
|
<Label Text="OpenMaui"
|
||||||
|
FontSize="48"
|
||||||
|
FontAttributes="Bold"
|
||||||
|
TextColor="{StaticResource Primary}"
|
||||||
|
HorizontalTextAlignment="Center" />
|
||||||
|
|
||||||
|
<Label Text="Control Gallery"
|
||||||
|
FontSize="24"
|
||||||
|
TextColor="{StaticResource Gray500}"
|
||||||
|
HorizontalTextAlignment="Center" />
|
||||||
|
|
||||||
|
<BoxView HeightRequest="2" Color="{StaticResource Gray200}" Margin="0,10" />
|
||||||
|
|
||||||
|
<Label Text="Welcome to the OpenMaui Control Gallery! This sample app demonstrates all 35+ controls available in the OpenMaui Linux platform."
|
||||||
|
FontSize="16"
|
||||||
|
HorizontalTextAlignment="Center"
|
||||||
|
LineBreakMode="WordWrap" />
|
||||||
|
|
||||||
|
<Frame BackgroundColor="{StaticResource Secondary}" Padding="20" CornerRadius="10">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Features" FontSize="20" FontAttributes="Bold" />
|
||||||
|
<Label Text="• Full SkiaSharp rendering" />
|
||||||
|
<Label Text="• X11 and Wayland support" />
|
||||||
|
<Label Text="• AT-SPI2 accessibility" />
|
||||||
|
<Label Text="• High DPI support" />
|
||||||
|
<Label Text="• Platform services (clipboard, notifications, etc.)" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<Label Text="Use the flyout menu to explore different control categories."
|
||||||
|
FontSize="14"
|
||||||
|
TextColor="{StaticResource Gray400}"
|
||||||
|
HorizontalTextAlignment="Center" />
|
||||||
|
|
||||||
|
<Button Text="Get Started"
|
||||||
|
BackgroundColor="{StaticResource Primary}"
|
||||||
|
TextColor="White"
|
||||||
|
FontAttributes="Bold"
|
||||||
|
CornerRadius="8"
|
||||||
|
Clicked="OnGetStartedClicked" />
|
||||||
|
|
||||||
|
<Label Text="Developed by MarketAlly LLC"
|
||||||
|
FontSize="12"
|
||||||
|
TextColor="{StaticResource Gray400}"
|
||||||
|
HorizontalTextAlignment="Center"
|
||||||
|
Margin="0,20,0,0" />
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class HomePage : ContentPage
|
||||||
|
{
|
||||||
|
public HomePage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnGetStartedClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await Shell.Current.GoToAsync("//ButtonsPage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.ImagesPage"
|
||||||
|
Title="Images">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Image Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Basic Image -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Basic Image" FontAttributes="Bold" />
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
WidthRequest="150"
|
||||||
|
HeightRequest="150"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Image Aspect Ratios -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Aspect Ratios" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label Text="AspectFit" FontSize="12" HorizontalOptions="Center" />
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
Aspect="AspectFit"
|
||||||
|
WidthRequest="80"
|
||||||
|
HeightRequest="80"
|
||||||
|
BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label Text="AspectFill" FontSize="12" HorizontalOptions="Center" />
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
Aspect="AspectFill"
|
||||||
|
WidthRequest="80"
|
||||||
|
HeightRequest="80"
|
||||||
|
BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label Text="Fill" FontSize="12" HorizontalOptions="Center" />
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
Aspect="Fill"
|
||||||
|
WidthRequest="80"
|
||||||
|
HeightRequest="80"
|
||||||
|
BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Image in Border -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Image with Border" FontAttributes="Bold" />
|
||||||
|
<Border StrokeThickness="3"
|
||||||
|
Stroke="{StaticResource Primary}"
|
||||||
|
StrokeShape="RoundRectangle 20"
|
||||||
|
HorizontalOptions="Center">
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
WidthRequest="120"
|
||||||
|
HeightRequest="120"
|
||||||
|
Aspect="AspectFill" />
|
||||||
|
</Border>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Circular Image -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Circular Image (Avatar Style)" FontAttributes="Bold" />
|
||||||
|
<Border StrokeThickness="0"
|
||||||
|
StrokeShape="RoundRectangle 60"
|
||||||
|
HorizontalOptions="Center"
|
||||||
|
WidthRequest="120"
|
||||||
|
HeightRequest="120">
|
||||||
|
<Image Source="dotnet_bot.png"
|
||||||
|
Aspect="AspectFill" />
|
||||||
|
</Border>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Image Loading States -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Image Loading" FontAttributes="Bold" />
|
||||||
|
<Label Text="Images support loading indicators and error handling" TextColor="{StaticResource Gray500}" />
|
||||||
|
<Image Source="https://via.placeholder.com/150"
|
||||||
|
WidthRequest="150"
|
||||||
|
HeightRequest="150"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class ImagesPage : ContentPage
|
||||||
|
{
|
||||||
|
public ImagesPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.LabelsPage"
|
||||||
|
Title="Labels">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Label Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Font Sizes -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Font Sizes" FontAttributes="Bold" />
|
||||||
|
<Label Text="Caption (12)" FontSize="12" />
|
||||||
|
<Label Text="Body (14)" FontSize="14" />
|
||||||
|
<Label Text="Subtitle (18)" FontSize="18" />
|
||||||
|
<Label Text="Title (24)" FontSize="24" />
|
||||||
|
<Label Text="Header (32)" FontSize="32" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Font Attributes -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Font Attributes" FontAttributes="Bold" />
|
||||||
|
<Label Text="Normal Text" />
|
||||||
|
<Label Text="Bold Text" FontAttributes="Bold" />
|
||||||
|
<Label Text="Italic Text" FontAttributes="Italic" />
|
||||||
|
<Label Text="Bold Italic" FontAttributes="Bold,Italic" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Text Colors -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Text Colors" FontAttributes="Bold" />
|
||||||
|
<Label Text="Primary Color" TextColor="{StaticResource Primary}" />
|
||||||
|
<Label Text="Tertiary Color" TextColor="{StaticResource Tertiary}" />
|
||||||
|
<Label Text="Gray 500" TextColor="{StaticResource Gray500}" />
|
||||||
|
<Label Text="Custom Red" TextColor="#FF5722" />
|
||||||
|
<Label Text="Custom Green" TextColor="#4CAF50" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Text Alignment -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Text Alignment" FontAttributes="Bold" />
|
||||||
|
<Label Text="Left Aligned" HorizontalTextAlignment="Start" BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
<Label Text="Center Aligned" HorizontalTextAlignment="Center" BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
<Label Text="Right Aligned" HorizontalTextAlignment="End" BackgroundColor="{StaticResource Gray100}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Text Decorations -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Text Decorations" FontAttributes="Bold" />
|
||||||
|
<Label Text="Underlined Text" TextDecorations="Underline" />
|
||||||
|
<Label Text="Strikethrough Text" TextDecorations="Strikethrough" />
|
||||||
|
<Label Text="Both Decorations" TextDecorations="Underline,Strikethrough" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Line Break Modes -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Line Break Modes" FontAttributes="Bold" />
|
||||||
|
<Label Text="This is a long text that will wrap to multiple lines when it exceeds the available width."
|
||||||
|
LineBreakMode="WordWrap" />
|
||||||
|
<Label Text="This is truncated at the tail..."
|
||||||
|
LineBreakMode="TailTruncation"
|
||||||
|
MaxLines="1" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class LabelsPage : ContentPage
|
||||||
|
{
|
||||||
|
public LabelsPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.PickersPage"
|
||||||
|
Title="Pickers">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Picker Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Basic Picker -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Basic Picker" FontAttributes="Bold" />
|
||||||
|
<Picker Title="Select a color" SelectedIndexChanged="OnColorPickerChanged">
|
||||||
|
<Picker.Items>
|
||||||
|
<x:String>Red</x:String>
|
||||||
|
<x:String>Green</x:String>
|
||||||
|
<x:String>Blue</x:String>
|
||||||
|
<x:String>Yellow</x:String>
|
||||||
|
<x:String>Purple</x:String>
|
||||||
|
</Picker.Items>
|
||||||
|
</Picker>
|
||||||
|
<Label x:Name="ColorResultLabel" Text="No color selected" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- DatePicker -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="DatePicker" FontAttributes="Bold" />
|
||||||
|
<DatePicker DateSelected="OnDateSelected" />
|
||||||
|
<Label x:Name="DateResultLabel" Text="Select a date" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- TimePicker -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="TimePicker" FontAttributes="Bold" />
|
||||||
|
<TimePicker PropertyChanged="OnTimeChanged" />
|
||||||
|
<Label x:Name="TimeResultLabel" Text="Select a time" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- DatePicker with Range -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="DatePicker with Range" FontAttributes="Bold" />
|
||||||
|
<Label Text="Limited to next 30 days" TextColor="{StaticResource Gray500}" />
|
||||||
|
<DatePicker x:Name="RangeDatePicker" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class PickersPage : ContentPage
|
||||||
|
{
|
||||||
|
public PickersPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
// Set date range
|
||||||
|
RangeDatePicker.MinimumDate = DateTime.Today;
|
||||||
|
RangeDatePicker.MaximumDate = DateTime.Today.AddDays(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnColorPickerChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var picker = (Picker)sender;
|
||||||
|
if (picker.SelectedIndex >= 0)
|
||||||
|
{
|
||||||
|
ColorResultLabel.Text = $"Selected: {picker.Items[picker.SelectedIndex]}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDateSelected(object sender, DateChangedEventArgs e)
|
||||||
|
{
|
||||||
|
DateResultLabel.Text = $"Selected: {e.NewDate:MMMM dd, yyyy}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTimeChanged(object sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.PropertyName == nameof(TimePicker.Time))
|
||||||
|
{
|
||||||
|
var picker = (TimePicker)sender;
|
||||||
|
TimeResultLabel.Text = $"Selected: {picker.Time:hh\\:mm}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.ProgressPage"
|
||||||
|
Title="Progress">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Progress Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- ProgressBar -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="ProgressBar" FontAttributes="Bold" />
|
||||||
|
<ProgressBar x:Name="DemoProgress" Progress="0.5" />
|
||||||
|
<HorizontalStackLayout Spacing="10" HorizontalOptions="Center">
|
||||||
|
<Button Text="0%" Clicked="OnProgress0" />
|
||||||
|
<Button Text="50%" Clicked="OnProgress50" />
|
||||||
|
<Button Text="100%" Clicked="OnProgress100" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Styled ProgressBars -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Styled ProgressBars" FontAttributes="Bold" />
|
||||||
|
<ProgressBar Progress="0.3" ProgressColor="{StaticResource Primary}" />
|
||||||
|
<ProgressBar Progress="0.6" ProgressColor="#4CAF50" />
|
||||||
|
<ProgressBar Progress="0.9" ProgressColor="#FF5722" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- ActivityIndicator -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="ActivityIndicator" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="20" HorizontalOptions="Center">
|
||||||
|
<ActivityIndicator IsRunning="True" Color="{StaticResource Primary}" />
|
||||||
|
<ActivityIndicator IsRunning="True" Color="#4CAF50" />
|
||||||
|
<ActivityIndicator IsRunning="True" Color="#FF5722" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Controlled ActivityIndicator -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Controlled ActivityIndicator" FontAttributes="Bold" />
|
||||||
|
<ActivityIndicator x:Name="ControlledIndicator" IsRunning="False" Color="{StaticResource Primary}" />
|
||||||
|
<HorizontalStackLayout Spacing="10" HorizontalOptions="Center">
|
||||||
|
<Button Text="Start" Clicked="OnStartIndicator" />
|
||||||
|
<Button Text="Stop" Clicked="OnStopIndicator" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Animated Progress Demo -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Animated Progress" FontAttributes="Bold" />
|
||||||
|
<ProgressBar x:Name="AnimatedProgress" Progress="0" />
|
||||||
|
<Button Text="Animate to 100%" Clicked="OnAnimateProgress" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Loading Overlay Demo -->
|
||||||
|
<Frame Padding="15" CornerRadius="8" BackgroundColor="{StaticResource Secondary}">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Loading State Demo" FontAttributes="Bold" />
|
||||||
|
<Grid>
|
||||||
|
<VerticalStackLayout x:Name="ContentPanel">
|
||||||
|
<Label Text="This is some content that can be loading..." />
|
||||||
|
<Button Text="Show Loading" Clicked="OnShowLoading" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
<VerticalStackLayout x:Name="LoadingPanel" IsVisible="False" HorizontalOptions="Center" VerticalOptions="Center">
|
||||||
|
<ActivityIndicator IsRunning="True" Color="{StaticResource Primary}" />
|
||||||
|
<Label Text="Loading..." HorizontalOptions="Center" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Grid>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class ProgressPage : ContentPage
|
||||||
|
{
|
||||||
|
public ProgressPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnProgress0(object sender, EventArgs e) => DemoProgress.Progress = 0;
|
||||||
|
private void OnProgress50(object sender, EventArgs e) => DemoProgress.Progress = 0.5;
|
||||||
|
private void OnProgress100(object sender, EventArgs e) => DemoProgress.Progress = 1.0;
|
||||||
|
|
||||||
|
private void OnStartIndicator(object sender, EventArgs e) => ControlledIndicator.IsRunning = true;
|
||||||
|
private void OnStopIndicator(object sender, EventArgs e) => ControlledIndicator.IsRunning = false;
|
||||||
|
|
||||||
|
private async void OnAnimateProgress(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
AnimatedProgress.Progress = 0;
|
||||||
|
await AnimatedProgress.ProgressTo(1.0, 2000, Easing.Linear);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnShowLoading(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ContentPanel.IsVisible = false;
|
||||||
|
LoadingPanel.IsVisible = true;
|
||||||
|
|
||||||
|
await Task.Delay(2000);
|
||||||
|
|
||||||
|
LoadingPanel.IsVisible = false;
|
||||||
|
ContentPanel.IsVisible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.RefreshViewPage"
|
||||||
|
Title="RefreshView">
|
||||||
|
|
||||||
|
<RefreshView x:Name="RefreshContainer"
|
||||||
|
IsRefreshing="{Binding IsRefreshing}"
|
||||||
|
Refreshing="OnRefreshing"
|
||||||
|
RefreshColor="{StaticResource Primary}">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="RefreshView" FontSize="24" FontAttributes="Bold" />
|
||||||
|
<Label Text="Pull down to refresh the content" TextColor="{StaticResource Gray500}" />
|
||||||
|
|
||||||
|
<Label x:Name="LastRefreshLabel"
|
||||||
|
Text="Last refreshed: Never"
|
||||||
|
TextColor="{StaticResource Gray400}"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
|
||||||
|
<BoxView HeightRequest="1" Color="{StaticResource Gray200}" />
|
||||||
|
|
||||||
|
<!-- Simulated content that gets refreshed -->
|
||||||
|
<Frame Padding="15" CornerRadius="8" BackgroundColor="{StaticResource Secondary}">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="News Feed" FontAttributes="Bold" FontSize="18" />
|
||||||
|
|
||||||
|
<Frame Padding="10" CornerRadius="5" BackgroundColor="White">
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label x:Name="NewsItem1" Text="Loading..." FontAttributes="Bold" />
|
||||||
|
<Label Text="2 minutes ago" TextColor="{StaticResource Gray400}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<Frame Padding="10" CornerRadius="5" BackgroundColor="White">
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label x:Name="NewsItem2" Text="Loading..." FontAttributes="Bold" />
|
||||||
|
<Label Text="15 minutes ago" TextColor="{StaticResource Gray400}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<Frame Padding="10" CornerRadius="5" BackgroundColor="White">
|
||||||
|
<VerticalStackLayout>
|
||||||
|
<Label x:Name="NewsItem3" Text="Loading..." FontAttributes="Bold" />
|
||||||
|
<Label Text="1 hour ago" TextColor="{StaticResource Gray400}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<Button Text="Manual Refresh"
|
||||||
|
Clicked="OnManualRefreshClicked"
|
||||||
|
BackgroundColor="{StaticResource Primary}"
|
||||||
|
TextColor="White" />
|
||||||
|
|
||||||
|
<Label Text="Tip: You can also pull down on this page to trigger a refresh."
|
||||||
|
FontSize="12"
|
||||||
|
TextColor="{StaticResource Gray400}"
|
||||||
|
HorizontalTextAlignment="Center" />
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</RefreshView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class RefreshViewPage : ContentPage
|
||||||
|
{
|
||||||
|
private readonly Random _random = new();
|
||||||
|
private readonly string[] _headlines = new[]
|
||||||
|
{
|
||||||
|
"OpenMaui 1.0 Released!",
|
||||||
|
"Linux Desktop Apps Made Easy",
|
||||||
|
"SkiaSharp Powers Modern UIs",
|
||||||
|
"Cross-Platform Development Grows",
|
||||||
|
".NET 9 Performance Boost",
|
||||||
|
"XAML Hot Reload Coming Soon",
|
||||||
|
"Wayland Support Expanding",
|
||||||
|
"Community Contributions Welcome",
|
||||||
|
"New Controls Added Weekly",
|
||||||
|
"Accessibility Features Improved"
|
||||||
|
};
|
||||||
|
|
||||||
|
public RefreshViewPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
UpdateNews();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnRefreshing(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Simulate network delay
|
||||||
|
await Task.Delay(1500);
|
||||||
|
|
||||||
|
UpdateNews();
|
||||||
|
LastRefreshLabel.Text = $"Last refreshed: {DateTime.Now:HH:mm:ss}";
|
||||||
|
|
||||||
|
RefreshContainer.IsRefreshing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnManualRefreshClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RefreshContainer.IsRefreshing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNews()
|
||||||
|
{
|
||||||
|
NewsItem1.Text = _headlines[_random.Next(_headlines.Length)];
|
||||||
|
NewsItem2.Text = _headlines[_random.Next(_headlines.Length)];
|
||||||
|
NewsItem3.Text = _headlines[_random.Next(_headlines.Length)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.SlidersPage"
|
||||||
|
Title="Sliders">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Slider Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- Basic Slider -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Basic Slider" FontAttributes="Bold" />
|
||||||
|
<Slider x:Name="BasicSlider" Minimum="0" Maximum="100" ValueChanged="OnSliderValueChanged" />
|
||||||
|
<Label x:Name="SliderValueLabel" Text="Value: 0" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Styled Slider -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Styled Slider" FontAttributes="Bold" />
|
||||||
|
<Slider Minimum="0" Maximum="100"
|
||||||
|
MinimumTrackColor="#4CAF50"
|
||||||
|
MaximumTrackColor="#E0E0E0"
|
||||||
|
ThumbColor="#388E3C" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Stepper -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Stepper" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="15">
|
||||||
|
<Stepper x:Name="MyStepper" Minimum="0" Maximum="10" Increment="1" ValueChanged="OnStepperValueChanged" />
|
||||||
|
<Label x:Name="StepperValueLabel" Text="Value: 0" VerticalOptions="Center" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Stepper with Custom Increment -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Stepper (Increment: 0.5)" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="15">
|
||||||
|
<Stepper x:Name="DecimalStepper" Minimum="0" Maximum="5" Increment="0.5" ValueChanged="OnDecimalStepperValueChanged" />
|
||||||
|
<Label x:Name="DecimalStepperLabel" Text="Value: 0.0" VerticalOptions="Center" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Interactive Demo -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Interactive Demo" FontAttributes="Bold" />
|
||||||
|
<Label Text="Adjust the slider to change the box size:" TextColor="{StaticResource Gray500}" />
|
||||||
|
<Slider x:Name="SizeSlider" Minimum="50" Maximum="200" Value="100" ValueChanged="OnSizeSliderChanged" />
|
||||||
|
<BoxView x:Name="DemoBox"
|
||||||
|
WidthRequest="100"
|
||||||
|
HeightRequest="100"
|
||||||
|
Color="{StaticResource Primary}"
|
||||||
|
HorizontalOptions="Center" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class SlidersPage : ContentPage
|
||||||
|
{
|
||||||
|
public SlidersPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSliderValueChanged(object sender, ValueChangedEventArgs e)
|
||||||
|
{
|
||||||
|
SliderValueLabel.Text = $"Value: {e.NewValue:F0}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnStepperValueChanged(object sender, ValueChangedEventArgs e)
|
||||||
|
{
|
||||||
|
StepperValueLabel.Text = $"Value: {e.NewValue:F0}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDecimalStepperValueChanged(object sender, ValueChangedEventArgs e)
|
||||||
|
{
|
||||||
|
DecimalStepperLabel.Text = $"Value: {e.NewValue:F1}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSizeSliderChanged(object sender, ValueChangedEventArgs e)
|
||||||
|
{
|
||||||
|
DemoBox.WidthRequest = e.NewValue;
|
||||||
|
DemoBox.HeightRequest = e.NewValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.SwipeViewPage"
|
||||||
|
Title="SwipeView">
|
||||||
|
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="SwipeView" FontSize="24" FontAttributes="Bold" />
|
||||||
|
<Label Text="Swipe items left or right to reveal actions" TextColor="{StaticResource Gray500}" />
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
|
||||||
|
<!-- Swipe to Delete -->
|
||||||
|
<Label Text="Swipe Left to Delete" FontAttributes="Bold" Margin="0,10,0,5" />
|
||||||
|
<SwipeView>
|
||||||
|
<SwipeView.RightItems>
|
||||||
|
<SwipeItems Mode="Execute">
|
||||||
|
<SwipeItem Text="Delete"
|
||||||
|
BackgroundColor="#FF5252"
|
||||||
|
Invoked="OnDeleteInvoked" />
|
||||||
|
</SwipeItems>
|
||||||
|
</SwipeView.RightItems>
|
||||||
|
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<BoxView WidthRequest="40" HeightRequest="40" Color="{StaticResource Primary}" CornerRadius="20" />
|
||||||
|
<VerticalStackLayout VerticalOptions="Center">
|
||||||
|
<Label Text="Email from John" FontAttributes="Bold" />
|
||||||
|
<Label Text="Meeting tomorrow at 10am" TextColor="{StaticResource Gray500}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
</SwipeView>
|
||||||
|
|
||||||
|
<!-- Swipe for Multiple Actions -->
|
||||||
|
<Label Text="Swipe Left for Multiple Actions" FontAttributes="Bold" Margin="0,10,0,5" />
|
||||||
|
<SwipeView>
|
||||||
|
<SwipeView.RightItems>
|
||||||
|
<SwipeItems>
|
||||||
|
<SwipeItem Text="Archive"
|
||||||
|
BackgroundColor="#FFC107"
|
||||||
|
Invoked="OnArchiveInvoked" />
|
||||||
|
<SwipeItem Text="Delete"
|
||||||
|
BackgroundColor="#FF5252"
|
||||||
|
Invoked="OnDeleteInvoked" />
|
||||||
|
</SwipeItems>
|
||||||
|
</SwipeView.RightItems>
|
||||||
|
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<BoxView WidthRequest="40" HeightRequest="40" Color="#4CAF50" CornerRadius="20" />
|
||||||
|
<VerticalStackLayout VerticalOptions="Center">
|
||||||
|
<Label Text="Email from Sarah" FontAttributes="Bold" />
|
||||||
|
<Label Text="Project update" TextColor="{StaticResource Gray500}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
</SwipeView>
|
||||||
|
|
||||||
|
<!-- Swipe Right to Favorite -->
|
||||||
|
<Label Text="Swipe Right to Favorite" FontAttributes="Bold" Margin="0,10,0,5" />
|
||||||
|
<SwipeView>
|
||||||
|
<SwipeView.LeftItems>
|
||||||
|
<SwipeItems>
|
||||||
|
<SwipeItem Text="★ Favorite"
|
||||||
|
BackgroundColor="#2196F3"
|
||||||
|
Invoked="OnFavoriteInvoked" />
|
||||||
|
</SwipeItems>
|
||||||
|
</SwipeView.LeftItems>
|
||||||
|
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<BoxView WidthRequest="40" HeightRequest="40" Color="#9C27B0" CornerRadius="20" />
|
||||||
|
<VerticalStackLayout VerticalOptions="Center">
|
||||||
|
<Label Text="Email from Mike" FontAttributes="Bold" />
|
||||||
|
<Label Text="Check out this article" TextColor="{StaticResource Gray500}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
</SwipeView>
|
||||||
|
|
||||||
|
<!-- Bidirectional Swipe -->
|
||||||
|
<Label Text="Swipe Both Directions" FontAttributes="Bold" Margin="0,10,0,5" />
|
||||||
|
<SwipeView>
|
||||||
|
<SwipeView.LeftItems>
|
||||||
|
<SwipeItems>
|
||||||
|
<SwipeItem Text="Reply"
|
||||||
|
BackgroundColor="#4CAF50"
|
||||||
|
Invoked="OnReplyInvoked" />
|
||||||
|
</SwipeItems>
|
||||||
|
</SwipeView.LeftItems>
|
||||||
|
<SwipeView.RightItems>
|
||||||
|
<SwipeItems>
|
||||||
|
<SwipeItem Text="Forward"
|
||||||
|
BackgroundColor="#2196F3"
|
||||||
|
Invoked="OnForwardInvoked" />
|
||||||
|
<SwipeItem Text="Delete"
|
||||||
|
BackgroundColor="#FF5252"
|
||||||
|
Invoked="OnDeleteInvoked" />
|
||||||
|
</SwipeItems>
|
||||||
|
</SwipeView.RightItems>
|
||||||
|
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<BoxView WidthRequest="40" HeightRequest="40" Color="#FF9800" CornerRadius="20" />
|
||||||
|
<VerticalStackLayout VerticalOptions="Center">
|
||||||
|
<Label Text="Email from Boss" FontAttributes="Bold" />
|
||||||
|
<Label Text="Quarterly review scheduled" TextColor="{StaticResource Gray500}" FontSize="12" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
</SwipeView>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class SwipeViewPage : ContentPage
|
||||||
|
{
|
||||||
|
public SwipeViewPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnDeleteInvoked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Delete", "Item would be deleted", "OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnArchiveInvoked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Archive", "Item would be archived", "OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnFavoriteInvoked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Favorite", "Item added to favorites", "OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnReplyInvoked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Reply", "Opening reply composer", "OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnForwardInvoked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await DisplayAlert("Forward", "Opening forward dialog", "OK");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="ControlGallery.Pages.TogglesPage"
|
||||||
|
Title="Toggles">
|
||||||
|
|
||||||
|
<ScrollView>
|
||||||
|
<VerticalStackLayout Spacing="20" Padding="20">
|
||||||
|
|
||||||
|
<Label Text="Toggle Controls" FontSize="24" FontAttributes="Bold" />
|
||||||
|
|
||||||
|
<!-- CheckBox -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="CheckBox" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="10">
|
||||||
|
<CheckBox x:Name="AgreeCheckBox" CheckedChanged="OnCheckBoxChanged" />
|
||||||
|
<Label Text="I agree to the terms" VerticalOptions="Center" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
<Label x:Name="CheckBoxLabel" Text="Not agreed" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Styled CheckBoxes -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Styled CheckBoxes" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="20">
|
||||||
|
<CheckBox Color="{StaticResource Primary}" IsChecked="True" />
|
||||||
|
<CheckBox Color="#4CAF50" IsChecked="True" />
|
||||||
|
<CheckBox Color="#FF5722" IsChecked="True" />
|
||||||
|
<CheckBox Color="#2196F3" IsChecked="True" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Switch -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Switch" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="15">
|
||||||
|
<Switch x:Name="NotificationSwitch" Toggled="OnSwitchToggled" />
|
||||||
|
<Label Text="Enable Notifications" VerticalOptions="Center" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
<Label x:Name="SwitchLabel" Text="Notifications: Off" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Styled Switches -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="Styled Switches" FontAttributes="Bold" />
|
||||||
|
<HorizontalStackLayout Spacing="20">
|
||||||
|
<Switch OnColor="{StaticResource Primary}" IsToggled="True" />
|
||||||
|
<Switch OnColor="#4CAF50" IsToggled="True" />
|
||||||
|
<Switch OnColor="#FF5722" IsToggled="True" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- RadioButton -->
|
||||||
|
<Frame Padding="15" CornerRadius="8">
|
||||||
|
<VerticalStackLayout Spacing="10">
|
||||||
|
<Label Text="RadioButton Group" FontAttributes="Bold" />
|
||||||
|
<RadioButton Content="Option A" GroupName="Options" CheckedChanged="OnRadioButtonChecked" />
|
||||||
|
<RadioButton Content="Option B" GroupName="Options" CheckedChanged="OnRadioButtonChecked" />
|
||||||
|
<RadioButton Content="Option C" GroupName="Options" CheckedChanged="OnRadioButtonChecked" />
|
||||||
|
<Label x:Name="RadioLabel" Text="No option selected" TextColor="{StaticResource Gray500}" />
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- Settings Demo -->
|
||||||
|
<Frame Padding="15" CornerRadius="8" BackgroundColor="{StaticResource Secondary}">
|
||||||
|
<VerticalStackLayout Spacing="15">
|
||||||
|
<Label Text="Settings Demo" FontAttributes="Bold" FontSize="18" />
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
<Label Text="Dark Mode" VerticalOptions="Center" />
|
||||||
|
<Switch Grid.Column="1" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
<Label Text="Push Notifications" VerticalOptions="Center" />
|
||||||
|
<Switch Grid.Column="1" IsToggled="True" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
<Label Text="Auto-Update" VerticalOptions="Center" />
|
||||||
|
<Switch Grid.Column="1" IsToggled="True" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
<Label Text="Analytics" VerticalOptions="Center" />
|
||||||
|
<CheckBox Grid.Column="1" IsChecked="True" />
|
||||||
|
</Grid>
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</VerticalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</ContentPage>
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
namespace ControlGallery.Pages;
|
||||||
|
|
||||||
|
public partial class TogglesPage : ContentPage
|
||||||
|
{
|
||||||
|
public TogglesPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCheckBoxChanged(object sender, CheckedChangedEventArgs e)
|
||||||
|
{
|
||||||
|
CheckBoxLabel.Text = e.Value ? "Agreed!" : "Not agreed";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSwitchToggled(object sender, ToggledEventArgs e)
|
||||||
|
{
|
||||||
|
SwitchLabel.Text = $"Notifications: {(e.Value ? "On" : "Off")}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnRadioButtonChecked(object sender, CheckedChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Value && sender is RadioButton rb)
|
||||||
|
{
|
||||||
|
RadioLabel.Text = $"Selected: {rb.Content}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
# OpenMaui Control Gallery
|
||||||
|
|
||||||
|
A comprehensive sample application demonstrating all 35+ controls available in OpenMaui for Linux.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
This gallery showcases:
|
||||||
|
|
||||||
|
- **Basic Controls**: Buttons, Labels, Entry, Editor
|
||||||
|
- **Selection Controls**: Picker, DatePicker, TimePicker, Slider, Stepper
|
||||||
|
- **Toggle Controls**: CheckBox, Switch, RadioButton
|
||||||
|
- **Progress Controls**: ProgressBar, ActivityIndicator
|
||||||
|
- **Image Controls**: Image, ImageButton with various aspect ratios
|
||||||
|
- **Collection Controls**: CollectionView, CarouselView with IndicatorView
|
||||||
|
- **Gesture Controls**: SwipeView, RefreshView
|
||||||
|
|
||||||
|
## Running the Sample
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd samples/ControlGallery
|
||||||
|
dotnet run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- .NET 9.0 SDK
|
||||||
|
- Linux with X11 or Wayland
|
||||||
|
- OpenMaui.Controls.Linux NuGet package
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
The gallery uses Shell navigation with a flyout menu to organize controls by category.
|
||||||
|
|
||||||
|
## Adding Images
|
||||||
|
|
||||||
|
Before running, add the following images to `Resources/Images/`:
|
||||||
|
- `dotnet_bot.png` - From official MAUI templates
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License - Copyright 2025 MarketAlly LLC
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Add fonts here
|
||||||
|
# Recommended: OpenSans-Regular.ttf, OpenSans-Semibold.ttf
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Add images here
|
||||||
|
# Required: dotnet_bot.png
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Image Resources
|
||||||
|
|
||||||
|
## Required Images
|
||||||
|
|
||||||
|
### dotnet_bot.png
|
||||||
|
Download from the official .NET MAUI repository:
|
||||||
|
https://github.com/dotnet/maui/blob/main/src/Templates/src/templates/maui-mobile/Resources/Images/dotnet_bot.png
|
||||||
|
|
||||||
|
Or use your own application icon.
|
||||||
|
|
||||||
|
## Adding Images
|
||||||
|
|
||||||
|
Place images in this folder and reference them in XAML:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<Image Source="dotnet_bot.png" WidthRequest="250" HeightRequest="310" />
|
||||||
|
```
|
||||||
|
|
||||||
|
Images are automatically included via the project file:
|
||||||
|
```xml
|
||||||
|
<MauiImage Include="Resources\Images\*" />
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
# VSIX Resources
|
||||||
|
|
||||||
|
## Required Images
|
||||||
|
|
||||||
|
Before publishing to Visual Studio Marketplace, add these images:
|
||||||
|
|
||||||
|
### Icon.png
|
||||||
|
- Size: 128x128 pixels
|
||||||
|
- Format: PNG with transparency
|
||||||
|
- Use: Extension icon in VS marketplace and extension manager
|
||||||
|
|
||||||
|
### Preview.png
|
||||||
|
- Size: 200x200 pixels (or larger, will be scaled)
|
||||||
|
- Format: PNG
|
||||||
|
- Use: Preview image in extension manager
|
||||||
|
|
||||||
|
## Recommended Design
|
||||||
|
|
||||||
|
Use the OpenMaui logo with Linux penguin integration:
|
||||||
|
- Purple/blue gradient (#512BD4 to #7B68EE)
|
||||||
|
- Clean, modern design
|
||||||
|
- Recognizable at small sizes
|
||||||
|
|
||||||
|
## Generating Icons
|
||||||
|
|
||||||
|
You can use tools like:
|
||||||
|
- Figma
|
||||||
|
- Adobe Illustrator
|
||||||
|
- Inkscape (open source)
|
||||||
|
|
||||||
|
Or commission from a designer on:
|
||||||
|
- Fiverr
|
||||||
|
- 99designs
|
||||||
Loading…
Reference in New Issue