Skip to main content

Overview

DaisyThemeController is a toggle-based theme switcher that provides multiple presentation modes. It’s ideal for simple light/dark theme switching or toggling between any two themes.
This control inherits from ToggleButton and includes all standard toggle button properties.

Properties

Mode

public ThemeControllerMode Mode { get; set; }
The display mode of the controller. Determines the visual appearance and interaction style. Type: ThemeControllerMode enum Default value: ThemeControllerMode.Toggle Possible values:
  • Toggle - Simple toggle switch
  • Checkbox - Checkbox style
  • Swap - Animated sun/moon swap icon
  • ToggleWithText - Toggle with custom text labels
  • ToggleWithIcons - Toggle with sun/moon icons
Example:
xmlns:daisy="using:Flowery.Controls"

<!-- Simple toggle -->
<daisy:DaisyThemeController Mode="Toggle" />

<!-- Animated swap -->
<daisy:DaisyThemeController Mode="Swap" />

<!-- With labels -->
<daisy:DaisyThemeController Mode="ToggleWithText" />

UncheckedTheme

public string UncheckedTheme { get; set; }
The theme name to apply when the controller is unchecked (off state). Default value: "Light" Example:
<daisy:DaisyThemeController 
    UncheckedTheme="Light"
    CheckedTheme="Synthwave" />

CheckedTheme

public string CheckedTheme { get; set; }
The theme name to apply when the controller is checked (on state). Default value: "Dark" Example:
<daisy:DaisyThemeController 
    UncheckedTheme="Cupcake"
    CheckedTheme="Dracula" />

UncheckedLabel

public string UncheckedLabel { get; set; }
Label displayed when unchecked. Only used in ToggleWithText mode. Default value: "Light" Example:
<daisy:DaisyThemeController 
    Mode="ToggleWithText"
    UncheckedLabel="Day"
    CheckedLabel="Night" />

CheckedLabel

public string CheckedLabel { get; set; }
Label displayed when checked. Only used in ToggleWithText mode. Default value: "Dark"

IsChecked

public bool? IsChecked { get; set; }
Gets or sets whether the toggle is checked. Inherited from ToggleButton. Example:
// Check programmatically
themeController.IsChecked = true;

// Subscribe to changes
themeController.Checked += (s, e) => Console.WriteLine("Checked!");
themeController.Unchecked += (s, e) => Console.WriteLine("Unchecked!");

Events

Checked

public event RoutedEventHandler Checked
Raised when the controller is checked. Inherited from ToggleButton.

Unchecked

public event RoutedEventHandler Unchecked
Raised when the controller is unchecked. Inherited from ToggleButton.

Mode Examples

Toggle Mode

Simple toggle switch appearance.
xmlns:daisy="using:Flowery.Controls"

<daisy:DaisyThemeController 
    Mode="Toggle"
    UncheckedTheme="Light"
    CheckedTheme="Dark" />

Checkbox Mode

Checkbox-style appearance.
<daisy:DaisyThemeController 
    Mode="Checkbox"
    UncheckedTheme="Light"
    CheckedTheme="Dark" />

Swap Mode

Animated sun/moon icon swap. Perfect for light/dark theme switching.
<daisy:DaisyThemeController 
    Mode="Swap"
    UncheckedTheme="Light"
    CheckedTheme="Dark" />
Swap mode provides a smooth animation between sun (light) and moon (dark) icons.

ToggleWithText Mode

Toggle switch with custom text labels on each side.
<daisy:DaisyThemeController 
    Mode="ToggleWithText"
    UncheckedTheme="Light"
    CheckedTheme="Synthwave"
    UncheckedLabel="Light"
    CheckedLabel="Synthwave" />
Use cases:
  • Branded theme switching
  • Custom theme name display
  • Non-standard light/dark labels

ToggleWithIcons Mode

Toggle switch with sun/moon icons.
<daisy:DaisyThemeController 
    Mode="ToggleWithIcons"
    UncheckedTheme="Light"
    CheckedTheme="Dark" />

Usage Examples

Basic Light/Dark Toggle

xmlns:daisy="using:Flowery.Controls"

<daisy:DaisyThemeController Mode="Swap" />
That’s it! The controller automatically:
  1. Syncs with the current theme on load
  2. Toggles between Light and Dark themes
  3. Updates when themes change externally

Custom Theme Toggle

<daisy:DaisyThemeController 
    Mode="ToggleWithText"
    UncheckedTheme="Cupcake"
    CheckedTheme="Dracula"
    UncheckedLabel="Cupcake"
    CheckedLabel="Dracula" />

In a Navigation Bar

xmlns:daisy="using:Flowery.Controls"

<Grid Background="{ThemeResource DaisyBase200Brush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    
    <TextBlock 
        Grid.Column="0"
        Text="My App" 
        VerticalAlignment="Center"
        Margin="16,0" />
    
    <daisy:DaisyThemeController 
        Grid.Column="1"
        Mode="Swap"
        Margin="16,8" />
</Grid>

Programmatic Control

using Flowery.Controls;
using Microsoft.UI.Xaml;

public sealed partial class MainPage : Page
{
    private DaisyThemeController _themeController;

    public MainPage()
    {
        InitializeComponent();
        
        _themeController = new DaisyThemeController
        {
            Mode = ThemeControllerMode.Swap,
            UncheckedTheme = "Light",
            CheckedTheme = "Synthwave"
        };
        
        // Subscribe to events
        _themeController.Checked += OnThemeChecked;
        _themeController.Unchecked += OnThemeUnchecked;
        
        // Add to layout
        ThemeContainer.Children.Add(_themeController);
    }

    private void OnThemeChecked(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("Dark theme active");
    }

    private void OnThemeUnchecked(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("Light theme active");
    }

    private void ToggleTheme()
    {
        // Programmatically toggle
        _themeController.IsChecked = !_themeController.IsChecked;
    }
}

With Tooltips

xmlns:daisy="using:Flowery.Controls"

<daisy:DaisyThemeController 
    Mode="Swap"
    ToolTipService.ToolTip="Switch theme" />

Behavior

Automatic Synchronization

The controller automatically synchronizes with DaisyThemeManager:
  1. On load, it checks the current theme
  2. If current theme matches CheckedTheme, it sets IsChecked = true
  3. If current theme matches UncheckedTheme, it sets IsChecked = false
  4. When toggled, it calls DaisyThemeManager.ApplyTheme()

Theme Application

When the user toggles the controller:
  1. The IsChecked state changes
  2. The control determines which theme to apply (CheckedTheme or UncheckedTheme)
  3. DaisyThemeManager.ApplyTheme() is called
  4. The visual state updates (animations play)
  5. All theme-aware controls update

Styling

The controller uses template-based rendering with visual states:
  • Checked state - Shows checked appearance
  • Unchecked state - Shows unchecked appearance
Colors are automatically derived from the current theme:
  • Toggle knob: DaisyPrimaryBrush
  • Sun icon: DaisyWarningBrush
  • Moon icon: DaisyInfoBrush
  • Checkmark: DaisyBaseContentBrush

Mode Reference

ModeVisualBest For
ToggleToggle switchStandard toggle UI
CheckboxCheckboxForm-style UI
SwapAnimated sun/moonLight/dark switching
ToggleWithTextToggle + labelsCustom theme names
ToggleWithIconsToggle + sun/moonIcon-based UI

Best Practices

  1. Use Swap mode for light/dark - It provides the best visual feedback for theme switching
  2. Match labels to themes - When using ToggleWithText, set labels to match theme names
  3. Consider context - Use ToggleWithText in settings panels where space allows
  4. Use Swap in toolbars - The compact animated icon works well in navigation bars
  5. Persist state - Subscribe to DaisyThemeManager.ThemeChanged to save user preferences

Advanced Usage

Dynamic Theme Assignment

using Flowery.Controls;

public void SetupThemeController()
{
    var controller = new DaisyThemeController
    {
        Mode = ThemeControllerMode.ToggleWithText
    };
    
    // Subscribe to theme changes
    DaisyThemeManager.ThemeChanged += (s, themeName) =>
    {
        // Update labels based on current theme
        if (DaisyThemeManager.IsDarkTheme(themeName))
        {
            controller.CheckedLabel = themeName;
        }
        else
        {
            controller.UncheckedLabel = themeName;
        }
    };
}

Multiple Controllers

You can have multiple controllers in your app - they all sync automatically:
<!-- In NavigationBar.xaml -->
<daisy:DaisyThemeController Mode="Swap" />

<!-- In SettingsPage.xaml -->
<daisy:DaisyThemeController Mode="ToggleWithText" />
Both controllers stay in sync because they use the same DaisyThemeManager.

ThemeControllerMode

public enum ThemeControllerMode
{
    Toggle,           // Simple toggle switch
    Checkbox,         // Checkbox style
    Swap,             // Animated sun/moon swap
    ToggleWithText,   // Toggle with text labels
    ToggleWithIcons   // Toggle with sun/moon icons
}

See Also

Build docs developers (and LLMs) love