✨ CherylUI.Uno

July 21, 2025 · View on GitHub


✨ CherylUI.Uno

CherylUI.Uno is a collection of UI controls and styles built for Uno Platform.


📱 UI Demo

https://github.com/user-attachments/assets/04cf44dd-e075-41f7-a664-e78650e0970b

https://github.com/user-attachments/assets/067a6a66-cf39-46c7-8d78-0a6750e17b06

https://github.com/user-attachments/assets/434dbcab-9d31-4aeb-a758-baa73dfca636


Temporary Documentation

Using the library

  1. Reference the CherylUI.Uno project or NuGet package in your Uno Platform solution.
  2. Merge the style dictionary in App.xaml:
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///Cheryl.Uno/Styles/Index.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
  1. Set up the InteractiveContainer to host dialogs and display the background. You must wrap it around the main content of your app, only one time.
<Page
    xmlns:controls="using:Cheryl.Uno.Controls">
    <controls:InteractiveContainer>
        <!-- App Content -->
    </controls:InteractiveContainer>
</Page>
  1. Use the controls by declaring the namespace and dropping them into your XAML:
<Page
    xmlns:controls="using:Cheryl.Uno.Controls">
    <controls:BottomTabControl>
        <!-- ... -->
    </controls:BottomTabControl>
</Page>

Custom controls

The library exposes the following controls. Each control has a default style defined in Styles/.

ControlDescription
BottomTabControl & BottomTabItemTab navigation control placed at the bottom of the screen
BusyAreaContainer that shows a ProgressRing overlay when IsBusy is true
GroupBoxSimple content container with a header
InteractiveContainerHosts dialogs, bottom sheets and toast content
SimplePageHeaderBasic page header with a centered title
SliverPagePage layout with a collapsing header when scrolled
SliverPageLongVariant of SliverPage with a larger header
MobileDatePickerBottom-sheet style date picker
MobilePickerGeneric list picker presented in a bottom sheet
MobileTextBoxText input that opens a bottom dialog for editing
MobileTimePickerBottom-sheet style time picker

BottomTabControl & BottomTabItem

{BA2D3CBF-BC92-41C1-B3B8-238E09506880}
<controls:BottomTabControl>
    <controls:BottomTabItem IconGlyph="&#xE80F;" Label="Home" />
    <controls:BottomTabItem IconGlyph="&#xE80F;" Label="Settings" />
</controls:BottomTabControl>

{6F64CF61-F0B5-4438-8C3F-F51BD97E7A94}
    <!-- Supposed to work like a standard WinUI NavigationView -->

SegmentedControl

{A7C8D04D-D936-4D4F-A0BA-E4B5A36E1088}
<ui:Segmented>
    <ui:SegmentedItem Content="60hz" />
    <ui:SegmentedItem Content="120hz" />
</ui:Segmented>

SimplePageHeader

{6FC61356-4B87-494F-B3E7-7A6D1C26CFD3}
<controls:SimplePageHeader Header="Bob" />

SliverPage

sliverpage

<controls:SliverPage Header="Buttons">
    <!-- page content -->
</controls:SliverPage>

SliverPageLong

sliverpagelong

<controls:SliverPageLong Header="Settings">
    <!-- page content -->
</controls:SliverPageLong>

Dialogs & Sheets

InteractiveContainer

Use InteractiveContainer to host dialogs and bottom sheets. Wrap it around the main content of your app so overlays can appear above everything.

<Page
    xmlns:controls="using:Cheryl.Uno.Controls">
    <controls:InteractiveContainer>
        <!-- App Content -->
    </controls:InteractiveContainer>
</Page>

Once in the visual tree, call its static methods to show or hide content:

InteractiveContainer.ShowDialog(new ConfirmationControl());
await InteractiveContainer.ShowBottomSheet(new MyBottomSheet());

InteractiveContainer.CloseDialog();
InteractiveContainer.CloseBottomSheet();

To retrieve a value from a dialog or sheet, await the task returned by ShowBottomSheet or ShowBottomDialog. When closing your custom control, call InteractiveContainer.CloseBottomSheet(result) or InteractiveContainer.CloseBottomDialog(result) with the value to return.

// Host page
var selectedColor = (Color)await InteractiveContainer.ShowBottomSheet(new ColorPickerSheet());

// Bottom sheet control
public sealed partial class ColorPickerSheet : UserControl
{
    public ColorPickerSheet()
    {
        this.InitializeComponent();
    }

    private void OnDone(object sender, RoutedEventArgs e)
    {
        InteractiveContainer.CloseBottomSheet(colorPicker.SelectedColor);
    }
}

Layout & Containers

BusyArea

busyarea

<controls:BusyArea IsBusy="True">
    <!-- content -->
</controls:BusyArea>

GroupBox

{4C47DAAE-7D85-4931-A5A1-3DC41AB46BE9}
<controls:GroupBox Header="Title">
    <!-- content -->
</controls:GroupBox>

Border

  • GlassBorderStyle
{3224DC18-4478-4FF4-B148-262CD80C4358}

Basically the border you see everywhere in that library.

<Border Style="{StaticResource GlassBorderStyle}">
</Border>

  • GlassSoftBorderStyle
{DE6148F5-E411-45BF-9156-64E103655F7C}

Like GlassBorderStyle but softer, perfect to be used on a GlassBorder because of a dialog or a bottomsheet for example.

<Border Style="{StaticResource GlassSoftBorderStyle}">
    <TextBlock Text="Inside" />
</Border>

  • GlassFrostedBorderStyle
{04CD0B96-E407-4721-B396-ABE685EE4B59}

Normal GlassBorder but frosted behind. To use if you need to overlay something.

<Border Style="{StaticResource GlassFrostedBorderStyle}">
</Border>

Input controls

MobileDatePicker

datepicker

<pickers:MobileDatePicker  Date="{x:Bind SelectedDate}" />

MobilePicker

pikcer

<pickers:MobilePicker ItemsSource="{Binding Options}"  SelectedItem="{Binding SelectedOption}"/>

MobileTextBox

mobileTB

<pickers:MobileTextBox  PlaceholderText="Enter name" PopupTitle="What is your First Name ?" Text="Billy" />

MobileTimePicker

mobileTimepicker

<pickers:MobileTimePicker Time="{x:Bind SelectedTime}" />

CheckBox

{E7B9996B-6A3A-421A-856B-CAF0FB787208}

RadioButton

{7291E24F-5F86-436D-BBA3-9B0B91CA1077}

Slider

{5C1C57BE-6E07-4403-87F1-A9AF4E5FC78A}
<Slider  />

<Slider Style="{StaticResource BigSliderStyle}" />          

ToggleSwitch

{C43DB612-5639-42B4-B0D6-2E8D89B4F216}

TextBlock

  <TextBlock  FontFamily="{StaticResource QuicksandBold}" ></TextBlock>
  <TextBlock  FontFamily="{StaticResource QuicksandRegular}" ></TextBlock>

Buttons

  • Normal Button
image
<Button Content="Button" />

  • DefaultButtonStyle
{4CC30EED-4FDF-47DE-9708-1F3478D56730}
<Button Content="Default" Style="{StaticResource DefaultButtonStyle}" />

  • Big Normal {D6BF3705-59FD-4129-B561-722193403996}
<Button Content="Secondary" Style="{StaticResource BigNormalButtonStyle}" />

  • Big Default {4D591E12-8628-4332-AC94-9D8BDC6747D6}
<Button Content="Mini" Style="{StaticResource BigButtonStyle}" />

  • Large {515B4E8B-ADD9-40E8-92F2-4A6F0352C682}
<Button Content="Small" Style="{StaticResource LargeButtonStyle}" />

  • Secondary

    {66D80599-06F2-42E5-B03E-ED092E2136D4}
<Button Content="Big" Style="{StaticResource SecondaryButtonStyle}" />

  • Text
{44E4A067-87D4-4548-9A3D-28BFCD6CFF5E}
<Button Content="Big normal" Style="{StaticResource TextButtonStyle}" />

{72B90D07-2B9C-485A-B5F2-DD0D72B57288}
        <MenuFlyout>
            <MenuFlyoutItem Text="Action" />
        </MenuFlyout>