Как изменить цвет стиля MetroFramework на все элементы управления

Я использую MetroFramework в своем настольном приложении и устанавливаю все цвета тем по умолчанию, внося изменения в родительский form Я хочу обновить все дочерние формы и управлять цветом в соответствии с цветом основной темы.

Проверьте дизайн пользовательского интерфейса

http://thielj.github.io/MetroFramework

Изменить темы

var m = new Random();
int next = m.Next(0, 13);
this.Style = (MetroColorStyle)next;

С действием меняется цвет основной формы, но цвет стиля контроллера и дочерней формы не меняется.


person Sunil Acharya    schedule 20.01.2016    source источник
comment
Если вы хотите элегантный вид Metro; укладка и окрашивание; возможно, вам лучше использовать WPF и MahApps Metro. Гораздо проще, чем WinForms. Тот проект Github, о котором вы упомянули, слишком печально выглядит мертвым. Нет активности с середины 2013 года   -  person MickyD    schedule 20.01.2016
comment
@Micky, это изначально копия MetroFramework, а не для WCF.   -  person Sunil Acharya    schedule 20.01.2016
comment
MetroFramework довольно надежен, я не вижу проблем с использованием библиотеки, устаревшей на 2 с половиной года, если она надежна!   -  person Zach Ross-Clyne    schedule 20.01.2016
comment
@ZachRoss-Clyne Здравствуйте, я ценю ваш ответ, поскольку вы используете эту структуру, поэтому я хочу узнать от вас много мыслей, которые не возражают против параметров тем и анимации. в настоящее время я хочу изменить стиль темы со страницы MDI или дочерней формы, но с действием только текущая форма меняет темы. Мой вопрос заключается в том, как изменить все приложение и управлять темами в соответствии с MDI или любой другой формой.   -  person Sunil Acharya    schedule 21.01.2016
comment
@ZachRoss-Clyne, если у вас нет моего, могу ли я получить какие-либо ваши контакты, такие как твиттер или электронная почта?   -  person Sunil Acharya    schedule 21.01.2016
comment
@Sunil Твиттер ZRC2011   -  person Zach Ross-Clyne    schedule 22.01.2016
comment
Вы можете посмотреть на этом сайте. Здесь много примеров использования ModernMetroUI Design от DenrioDenise. denricdenise.info/2014/09/how-to-use -winforms-модерн-интерфейс   -  person Roel    schedule 07.08.2016
comment
@ShiftN'Tab Да, я проверяю, но недостаточно информации, чтобы узнать больше о MetroFramwork.   -  person Sunil Acharya    schedule 10.08.2016
comment
@SunilAcharya попробуйте это и загрузите демонстрационную версию приложения, есть источник для поиска github.com/ dennismagno/metroframework-modern-ui   -  person Roel    schedule 10.08.2016


Ответы (2)


Привет, Сунил,

Пример -1 Панель инструментов в MetroStyleManager добавить

Добавить StyleManager Установить настройку

Пример 2 (метод расширения)

    public static void SetDefaultStyle(this IContainer contr, MetroForm owner, MetroColorStyle style)
    {
        MetroStyleManager manager = FindManager(contr, owner);
        manager.Style = style;
    }
    public static void SetDefaultTheme(this IContainer contr, MetroForm owner, MetroThemeStyle thme)
    {
        MetroStyleManager manager = FindManager(contr, owner);
        manager.Theme = thme;
    }
    private static MetroStyleManager FindManager(IContainer contr, MetroForm owner)
    {
        MetroStyleManager manager = new MetroStyleManager(contr);
        foreach (IComponent item in contr.Components)
        {
            if (((MetroStyleManager)item).Owner == owner)
            {
                 manager = (MetroStyleManager)item;
            }
        }
        return manager;
    }

С использованием:

    public frmMain()
    {
        InitializeComponent();            
        this.components.SetDefaultStyle(this, MetroColorStyle.Purple);
    }

Пример 3: если вы хотите установить тему для всех форм.

Шаг 1. Создайте новый класс "MyExtensions.cs". Это содержание:

public static class MyExtensions
{
    //What is your style
    private const MetroColorStyle FormStyle = MetroColorStyle.Green;
    public static void SetStyle(this IContainer container, MetroForm ownerForm)
    {
        if (container == null)
        {
            container = new System.ComponentModel.Container();
        }
        var manager = new MetroFramework.Components.MetroStyleManager(container);
        manager.Owner = ownerForm;
        container.SetDefaultStyle(ownerForm, FormStyle);


    }
    public static void SetDefaultStyle(this IContainer contr, MetroForm owner, MetroColorStyle style)
    {
        MetroStyleManager manager = FindManager(contr, owner);
        manager.Style = style;
        owner.Style = style;
    }
    public static void SetDefaultTheme(this IContainer contr, MetroForm owner, MetroThemeStyle thme)
    {
        MetroStyleManager manager = FindManager(contr, owner);
        manager.Theme = thme;
    }
    private static MetroStyleManager FindManager(IContainer contr, MetroForm owner)
    {
        MetroStyleManager manager = null;
        foreach (IComponent item in contr.Components)
        {
            if (((MetroStyleManager)item).Owner == owner)
            {
                manager = (MetroStyleManager)item;
            }
        }
        return manager;
    }
}

Шаг 2. Во всех ваших формах вам нужно будет вызвать подчиненный метод в методе «Загрузить». Пример Form1.cs для

private void Form1_Load(object sender, EventArgs e)
{
    this.components.SetStyle(this);
}
person Fatih GÜRDAL    schedule 06.08.2016
comment
Да, я сделал проект. @SunilAcharya Проект SS - person Fatih GÜRDAL; 11.08.2016
comment
Но как я могу применить выбранный стиль и тему ко всем моим открытым формам? - person Pratikk; 01.04.2017
comment
Привет @Pratikk Вы должны создать форму с именем MyBaseWinForm, и все формы должны быть унаследованы от нее. Динамически добавьте MetroStyleManager в метод конструктора MyBaseWinForm, и вы сможете поместить в этот класс коды из примера 2. Так что вы можете исправить это через наследование. - person Fatih GÜRDAL; 01.04.2017
comment
Я получаю сообщение об ошибке. Метод расширения должен быть определен в неуниверсальном статическом классе. Можете ли вы прислать мне пример этого, чтобы я мог изучить и реализовать его в своем проекте? - person Pratikk; 03.04.2017
comment
@Pratikk Класс, в котором используются методы расширения, должен быть отдельным и статическим. Я добавил пример 3 для вас - person Fatih GÜRDAL; 06.04.2017

Я знаю, что это старый вопрос, но так же, как вы искали решение, и это было так же просто, как использование метода Clone() для StyleManager, это изменит стиль формы и всех элементов управления MetroFrameWork, которые она содержит

Form1 _form1 = new Form1();
this.StyleManager.Clone(_form1); //This will do everything for you

Примечание. Для работы свойство UseStyleColors элементов управления формой должно быть включеноTrue.

введите здесь описание изображения

person J. Rodríguez    schedule 05.10.2018