Show / Hide Table of Contents

KryptonThemeBrowser

Overview

The KryptonThemeBrowser class provides a static utility for displaying theme selection dialogs. It offers a centralized way to show theme browser dialogs with customizable data and layout options, enabling users to preview and select from available Krypton themes.

Class Hierarchy

System.Object
└── Krypton.Toolkit.KryptonThemeBrowser

Key Methods

Show Method

public static void Show(KryptonThemeBrowserData themeBrowserData, RightToLeftLayout? rightToLeftLayout = RightToLeftLayout.LeftToRight)
  • Purpose: Displays a theme browser dialog with the specified data and layout
  • Parameters:
    • themeBrowserData: Configuration data for the theme browser
    • rightToLeftLayout: Optional RTL layout support (defaults to LeftToRight)
  • Usage: Main entry point for showing theme selection dialogs

ShowCore Method

private static void ShowCore(KryptonThemeBrowserData themeBrowserData, RightToLeftLayout? layout)
  • Purpose: Internal implementation of the theme browser display logic
  • Parameters:
    • themeBrowserData: Configuration data for the theme browser
    • layout: RTL layout configuration
  • Implementation: Handles the actual dialog creation and display

Advanced Usage Patterns

Basic Theme Browser

public void ShowBasicThemeBrowser()
{
    var themeData = new KryptonThemeBrowserData
    {
        Title = "Select Theme",
        Description = "Choose a theme for your application",
        // Add theme configuration
    };

    KryptonThemeBrowser.Show(themeData);
}

Advanced Theme Browser with Custom Data

public class ThemeManager
{
    public void ShowAdvancedThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Application Theme Selection",
            Description = "Select a theme that best suits your preferences",
            // Add custom theme data
        };

        // Show with RTL support if needed
        RightToLeftLayout layout = IsRightToLeftLanguage() 
            ? RightToLeftLayout.Yes 
            : RightToLeftLayout.No;

        KryptonThemeBrowser.Show(themeData, layout);
    }

    private bool IsRightToLeftLanguage()
    {
        return CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft;
    }
}

Theme Browser with Callback

public class ApplicationThemeManager
{
    public void ShowThemeBrowserWithCallback()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Choose Application Theme",
            Description = "Select a theme for the application interface",
            // Configure theme data
        };

        // Show theme browser
        KryptonThemeBrowser.Show(themeData);

        // Handle theme selection result
        HandleThemeSelection();
    }

    private void HandleThemeSelection()
    {
        // Process the selected theme
        var selectedTheme = GetSelectedTheme();
        if (selectedTheme != null)
        {
            ApplyTheme(selectedTheme);
            SaveThemePreference(selectedTheme);
        }
    }

    private object GetSelectedTheme()
    {
        // Implementation to get the selected theme
        return null;
    }

    private void ApplyTheme(object theme)
    {
        // Apply the selected theme to the application
    }

    private void SaveThemePreference(object theme)
    {
        // Save the theme preference for future use
    }
}

Multi-Language Theme Browser

public class LocalizedThemeManager
{
    public void ShowLocalizedThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = GetLocalizedString("ThemeBrowserTitle"),
            Description = GetLocalizedString("ThemeBrowserDescription"),
            // Add localized theme data
        };

        // Determine RTL layout based on current culture
        RightToLeftLayout layout = DetermineRightToLeftLayout();

        KryptonThemeBrowser.Show(themeData, layout);
    }

    private string GetLocalizedString(string key)
    {
        // Implementation to get localized strings
        return key; // Placeholder
    }

    private RightToLeftLayout DetermineRightToLeftLayout()
    {
        var culture = CultureInfo.CurrentUICulture;
        
        // Check if the current culture is RTL
        if (culture.TextInfo.IsRightToLeft)
        {
            return RightToLeftLayout.Yes;
        }

        // Check specific RTL languages
        var rtlLanguages = new[] { "ar", "he", "fa", "ur" };
        if (rtlLanguages.Contains(culture.TwoLetterISOLanguageName))
        {
            return RightToLeftLayout.Yes;
        }

        return RightToLeftLayout.No;
    }
}

Integration Patterns

Settings Dialog Integration

public class SettingsDialog : Form
{
    private KryptonButton themeButton;

    public SettingsDialog()
    {
        InitializeComponent();
        SetupThemeButton();
    }

    private void SetupThemeButton()
    {
        themeButton = new KryptonButton
        {
            Text = "Change Theme",
            Dock = DockStyle.Fill
        };

        themeButton.Click += ThemeButton_Click;
    }

    private void ThemeButton_Click(object? sender, EventArgs e)
    {
        ShowThemeBrowser();
    }

    private void ShowThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Application Theme",
            Description = "Select a theme for the application interface",
            // Configure theme data
        };

        KryptonThemeBrowser.Show(themeData);
    }
}

Application Startup Theme Selection

public class ApplicationStartup
{
    public static void ShowStartupThemeSelection()
    {
        // Check if this is the first run
        if (IsFirstRun())
        {
            ShowWelcomeThemeBrowser();
        }
        else
        {
            // Load saved theme preference
            LoadSavedTheme();
        }
    }

    private static bool IsFirstRun()
    {
        // Implementation to check if this is the first run
        return true; // Placeholder
    }

    private static void ShowWelcomeThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Welcome - Choose Your Theme",
            Description = "Select a theme to personalize your application experience",
            // Add welcome-specific theme data
        };

        KryptonThemeBrowser.Show(themeData);
    }

    private static void LoadSavedTheme()
    {
        // Implementation to load saved theme preference
    }
}

Dynamic Theme Switching

public class DynamicThemeManager
{
    public void ShowThemeSwitcher()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Switch Theme",
            Description = "Change the application theme instantly",
            // Configure theme data for dynamic switching
        };

        // Show theme browser
        KryptonThemeBrowser.Show(themeData);

        // Apply theme changes immediately
        ApplyThemeChanges();
    }

    private void ApplyThemeChanges()
    {
        // Implementation to apply theme changes
        // This might involve updating the global palette
        // and refreshing all forms
    }
}

Performance Considerations

  • Static Methods: Efficient static method calls without instance creation
  • Memory Management: Minimal memory footprint for utility class
  • Dialog Lifecycle: Proper dialog creation and disposal
  • Theme Loading: Optimized theme data loading and processing

Common Issues and Solutions

Theme Browser Not Showing

Issue: Theme browser dialog not appearing
Solution: Ensure proper theme data configuration:

var themeData = new KryptonThemeBrowserData
{
    Title = "Theme Selection",
    Description = "Choose a theme",
    // Ensure all required properties are set
};

KryptonThemeBrowser.Show(themeData);

RTL Layout Issues

Issue: Right-to-left layout not working correctly
Solution: Properly configure RTL layout:

RightToLeftLayout layout = CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft 
    ? RightToLeftLayout.Yes 
    : RightToLeftLayout.No;

KryptonThemeBrowser.Show(themeData, layout);

Theme Data Configuration

Issue: Theme browser showing incorrect or missing data
Solution: Ensure proper theme data setup:

var themeData = new KryptonThemeBrowserData
{
    Title = "Select Theme",
    Description = "Choose your preferred theme",
    // Add all necessary theme configuration
    // Ensure themes are properly loaded and configured
};

Design-Time Integration

Visual Studio Designer

  • Static Class: Not available in toolbox (static utility class)
  • Method Access: Accessible through code only
  • Configuration: Theme data configuration through code

Usage Patterns

  • Settings Dialogs: Integration with application settings
  • Startup Wizards: First-run theme selection
  • Dynamic Switching: Runtime theme changes
  • Localization: Multi-language theme selection

Migration and Compatibility

Theme System Integration

public class LegacyThemeManager
{
    public void MigrateToKryptonThemeBrowser()
    {
        // Old theme selection method
        // var oldThemeDialog = new OldThemeDialog();
        // oldThemeDialog.ShowDialog();

        // New Krypton theme browser
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Theme Selection",
            Description = "Choose your preferred theme",
            // Migrate old theme data to new format
        };

        KryptonThemeBrowser.Show(themeData);
    }
}

Backward Compatibility

public class CompatibleThemeManager
{
    public void ShowThemeBrowser(bool useLegacy = false)
    {
        if (useLegacy)
        {
            ShowLegacyThemeDialog();
        }
        else
        {
            ShowKryptonThemeBrowser();
        }
    }

    private void ShowLegacyThemeDialog()
    {
        // Legacy theme dialog implementation
    }

    private void ShowKryptonThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Theme Selection",
            Description = "Choose your preferred theme",
        };

        KryptonThemeBrowser.Show(themeData);
    }
}

Real-World Integration Examples

Application Settings Integration

public partial class ApplicationSettingsForm : Form
{
    private KryptonButton themeButton;
    private KryptonLabel currentThemeLabel;

    public ApplicationSettingsForm()
    {
        InitializeComponent();
        SetupThemeSection();
    }

    private void SetupThemeSection()
    {
        // Current theme label
        currentThemeLabel = new KryptonLabel
        {
            Text = $"Current Theme: {GetCurrentThemeName()}",
            Dock = DockStyle.Fill,
            LabelStyle = LabelStyle.NormalControl
        };

        // Theme button
        themeButton = new KryptonButton
        {
            Text = "Change Theme...",
            Dock = DockStyle.Fill
        };

        themeButton.Click += ThemeButton_Click;

        // Add to layout
        var themeLayout = new KryptonTableLayoutPanel
        {
            ColumnCount = 2,
            RowCount = 1,
            Dock = DockStyle.Fill
        };

        themeLayout.Controls.Add(currentThemeLabel, 0, 0);
        themeLayout.Controls.Add(themeButton, 1, 0);

        Controls.Add(themeLayout);
    }

    private void ThemeButton_Click(object? sender, EventArgs e)
    {
        ShowThemeBrowser();
    }

    private void ShowThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Application Theme",
            Description = "Select a theme for the application interface. Changes will be applied immediately.",
            // Configure theme data
        };

        KryptonThemeBrowser.Show(themeData);

        // Update current theme label
        currentThemeLabel.Text = $"Current Theme: {GetCurrentThemeName()}";
    }

    private string GetCurrentThemeName()
    {
        // Implementation to get current theme name
        return "Default Theme";
    }
}

Welcome Wizard Integration

public class WelcomeWizard : Form
{
    private int currentStep = 0;
    private readonly List<WizardStep> steps;

    public WelcomeWizard()
    {
        InitializeComponent();
        steps = CreateWizardSteps();
        ShowCurrentStep();
    }

    private List<WizardStep> CreateWizardSteps()
    {
        return new List<WizardStep>
        {
            new WizardStep("Welcome", "Welcome to the application setup wizard."),
            new WizardStep("Theme Selection", "Choose your preferred theme."),
            new WizardStep("Configuration", "Configure basic settings."),
            new WizardStep("Complete", "Setup is complete!")
        };
    }

    private void ShowCurrentStep()
    {
        var step = steps[currentStep];
        
        switch (currentStep)
        {
            case 1: // Theme selection step
                ShowThemeSelectionStep();
                break;
            default:
                ShowDefaultStep(step);
                break;
        }
    }

    private void ShowThemeSelectionStep()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Choose Your Theme",
            Description = "Select a theme that best suits your preferences. You can change this later in settings.",
            // Configure theme data for welcome wizard
        };

        KryptonThemeBrowser.Show(themeData);
    }

    private void ShowDefaultStep(WizardStep step)
    {
        // Implementation for other wizard steps
    }
}

public class WizardStep
{
    public string Title { get; set; }
    public string Description { get; set; }

    public WizardStep(string title, string description)
    {
        Title = title;
        Description = description;
    }
}

Dynamic Theme Switcher

public class DynamicThemeSwitcher : UserControl
{
    private KryptonButton switchThemeButton;
    private KryptonLabel currentThemeLabel;
    private Timer themeUpdateTimer;

    public DynamicThemeSwitcher()
    {
        InitializeComponent();
        SetupThemeSwitcher();
    }

    private void SetupThemeSwitcher()
    {
        // Current theme label
        currentThemeLabel = new KryptonLabel
        {
            Text = $"Current: {GetCurrentThemeName()}",
            Dock = DockStyle.Fill,
            LabelStyle = LabelStyle.NormalControl
        };

        // Switch theme button
        switchThemeButton = new KryptonButton
        {
            Text = "Switch Theme",
            Dock = DockStyle.Fill
        };

        switchThemeButton.Click += SwitchThemeButton_Click;

        // Add to layout
        var layout = new KryptonTableLayoutPanel
        {
            ColumnCount = 2,
            RowCount = 1,
            Dock = DockStyle.Fill
        };

        layout.Controls.Add(currentThemeLabel, 0, 0);
        layout.Controls.Add(switchThemeButton, 1, 0);

        Controls.Add(layout);

        // Setup timer for theme updates
        themeUpdateTimer = new Timer { Interval = 1000 };
        themeUpdateTimer.Tick += OnThemeUpdateTimer;
        themeUpdateTimer.Start();
    }

    private void SwitchThemeButton_Click(object? sender, EventArgs e)
    {
        ShowThemeBrowser();
    }

    private void ShowThemeBrowser()
    {
        var themeData = new KryptonThemeBrowserData
        {
            Title = "Switch Theme",
            Description = "Change the application theme. The new theme will be applied immediately to all open windows.",
            // Configure theme data for dynamic switching
        };

        KryptonThemeBrowser.Show(themeData);
    }

    private void OnThemeUpdateTimer(object? sender, EventArgs e)
    {
        // Update current theme label
        currentThemeLabel.Text = $"Current: {GetCurrentThemeName()}";
    }

    private string GetCurrentThemeName()
    {
        // Implementation to get current theme name
        return "Default Theme";
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            themeUpdateTimer?.Dispose();
        }
        base.Dispose(disposing);
    }
}
Back to top Krypton Component Suite 2024 BSD 3-Clause License © Component Factory Pty Ltd, 2006 - 2016, All rights reserved. Modifications by Peter Wagner (aka Wagnerp), Simon Coghlan (aka Smurf-IV), Giduac, Tobitege, Lesarndro, KamaniAR & Ahmed Abdelhameed et al. 2017 - 2025. All rights reserved. https://github.com/Krypton-Suite