Как переключать темы в Telerik WinForms?

Как сообщить Telerik для WinForms, какие из его тем использовать?

Я создал новый проект WinForms и сбросил RadPageView в форме, но там есть 5-пиксельный край мертвого пространства на всем пути, вкладки почти в два раза выше, чем они должны быть, и все блестяще и синий. Даже несмотря на потраченное впустую пространство, весь этот синий материал выглядел бы ужасно неуместным в нашем приложении. Мне просто нужен стандартный вид Windows, и я предполагаю, что для этого нужно выбрать другую, менее голубую, менее блестящую тему. (Или есть другой способ?)

Вот что я пробовал:

  • Я попробовал установить EnableTheming в False, но тогда у вкладок нет границ, поэтому нет никаких указаний на то, где щелкнуть или какая вкладка активна - вообще ничего хорошего.
  • Я могу скрыть свойство ThemeName в Property Grid, но единственными параметрами являются "Reset" и "ControlDefault". Ни одна настройка не делает ничего (даже если EnableTheming установлен на True).
  • В панели инструментов есть куча классов тем (AquaTheme, BreezeTheme и т.д.), но добавление их в мою форму не имеет никакого значения. Я думал, они могут появиться в выпадающем списке ThemeName, но они этого не делают.
  • Я попытался сбросить RadThemeManager в моей форме, но у него есть только коллекция LoadedThemes, которая пуста. Я могу добавить к нему что-то, но это просто добавляет ThemeSource, и установка одного из них, кажется, связана с просмотром файла, и у меня нет файлов тем для просмотра.
  • В RadPageView есть свойство ThemeClassName, но это просто строка (по умолчанию используется Telerik.WinControls.UI.RadPageView), и я понятия не имею, что я могу изменить или как она относится к темам.

Это смешно. Все, что я хочу - это элемент управления вкладкой, который выглядит как элемент управления вкладкой! Как я могу это сделать?

Ответ 1

Лучшим способом выполнения этой прикладной программы будет использование службы ThemeResolutionService. Сначала вам нужно вытащить одну из тем из панели инструментов. Например, если вы добавите компонент Windows7Theme в свою форму, вы должны применить тему, используя следующее.

private void Form1_Load(object sender, EventArgs e)
{
    ThemeResolutionService.ApplicationThemeName = "Windows7";
}

Я рекомендую проверить это видео, связанное с темами: http://tv.telerik.com/watch/winforms/visualstylebuilder/changing-themes-at-run-time-with-radcontrols-winforms

Ответ 2

В настоящее время я работаю над приложением Winform/Telerik. Это приложение MDI.

Во-первых, я добавил в "Референции моего проекта" документацию Telerik.Wincontrols.Themes.Breeze, а затем в конструкторе моей основной формы вот что я сделал:

    private fMain()
    {
        InitializeComponent();

        ThemeResolutionService.ApplicationThemeName = "Breeze"; 
        RadGridLocalizationProvider.CurrentProvider = new FrenchRadGridLocalizationProvider();
    }

Я также добавил французский RadGridLocalizationProvider.

И это работает, все мои RadDataGridViews на французском языке и имеют тему Breeze.

Даже если используемая форма не является Telerik, это мой случай, я не использую RadForm!

Ответ 3

Чтобы сделать динамическую загрузку тем, я сделал следующее:

private void LoadTheme()
{

        var themefiles = Directory.GetFiles(System.Windows.Forms.Application.StartupPath, "Telerik.WinControls.Themes.*.dll");

        foreach (var theme in themefiles)
        {
            var themeAssembly = Assembly.LoadFile(theme);
            var themeType = themeAssembly.GetTypes().Where(t => typeof(RadThemeComponentBase).IsAssignableFrom(t)).FirstOrDefault();
            if (themeType != null)
            {
                RadThemeComponentBase themeObject = (RadThemeComponentBase)Activator.CreateInstance(themeType);
                if (themeObject != null)
                {
                    themeObject.Load();
                }
            }
        }
        var themeList = ThemeRepository.AvailableThemeNames.ToList();                
            themeDropDown.DataSource = themeList;
}

private void ThemeDropDown_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
{
            string strTheme = themeDropDown.Text;
            Theme theme = ThemeResolutionService.GetTheme(strTheme);
            if (theme != null)
            {
                    ThemeResolutionService.ApplicationThemeName = theme.Name;    
            }
}

Я смог добиться совершенно динамичного изменения темы. Если Telerik выпускает или обновляет темы в будущем, единственное, что требуется, - это добавить DLL темы в папку приложения.