Как я могу применить свою собственную тему к своему приложению Windows Forms? - PullRequest
4 голосов
/ 03 ноября 2010

При выполнении приложения Windows Forms в C # вид формы выглядит так же, как тема Windows.

Как я могу дать свою собственную тему для моего приложения, которая не зависит от темы Windows?

Ответы [ 4 ]

3 голосов
/ 03 ноября 2010

Вы не можете сделать это легко.В вашем распоряжении есть несколько альтернатив.

  1. Самый простой способ - создать собственный XML-файл Skin, в котором вы указываете свои собственные цвета для своего Приложения, вы читаете его черезКласс вы создаете и применяете новые цвета.Это будет держать вещи отделенными и готовыми к будущим изменениям.Но учтите, что вы все равно не сможете изменить способ отображения строки заголовка и другие специфические для системы вещи, например, как выглядят кнопки X и Развернуть.

  2. Расширение по точке1, вы можете создать свои формы как без полей и создать свое окно с пользовательской окраской (переопределить OnPaint) и изображения.Это сложнее сделать.Возможно, вы захотите наследовать от класса Form и создать свой собственный CustomDrawnForm, который вы будете использовать в своем приложении.

  3. Используйте одну из множества библиотек элементов управления, например DevExpress.Некоторые бесплатны, некоторые дорогие.

То, что вы пытаетесь сделать, не очень просто в Windows.Forms, и, возможно, вам стоит взглянуть на WPF и другие альтернативы.

2 голосов
/ 03 ноября 2010

Переопределите метод OnPaint и нарисуйте все, что захотите. :)

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    SolidBrush brush = new SolidBrush(Color.Black);
    float percent = (float)(val - min) / (float)(max - min);
    Rectangle rect = this.ClientRectangle;

    rect.Width = (int)((float)rect.Width * percent);

    g.FillRectangle(brush, rect);

    brush.Dispose();
    g.Dispose();
}
1 голос
/ 04 ноября 2010

Зависит от вашего намерения по поводу темы;как говорит Ханс в своем комментарии, обычно использование системной «темы» для элементов управления и внешнего вида окна считается преимуществом.

Однако для элементов темы в вашем приложении - например, для фона панели заголовка или цвета шрифта заголовкаи т. д. затем я построю интерфейс с определениями цветов / изображений в вашем приложении (например, ITheme), а затем просто использую регулярную привязку данных для их соответствующей настройки во время выполнения, когда установлен ITheme.

public interface ITheme
{
    string Name { get; }
    Image Logo { get; }
    String BrandText1 { get; }
    String BrandText2 { get; }
    Image BrandBannerLogo { get; }
    Color BrandPanelText_Left { get; }
    Color BrandPanelText_Centre { get; }
}

На самом деле, вы могли бы сделать еще один шаг ... Например, в нашем приложении мы также определяем IThemeManager:

public interface IThemeManager : INotifyPropertyChanged
{
    event EventHandler CurrentThemeChanged;
    ITheme CurrentTheme { get; set; }
    Dictionary<string, ITheme> AvailableThemes { get; }
}

. Мы разрешаем вводить в ThemeManager зависимость, а затемпривязать к его Current свойству в наших элементах управления:

    [Dependency]
    public IThemeManager ThemeManager
    {
        get { return _themeManager; }
        set
        {
            if (_themeManager != value)
            {
                _themeManager = value;
                if (_themeManager != null && !DesignMode)
                {
                    _headerPanelBackgroundImageBinding = themePanel.DataBindings.Add("BackgroundImage", ThemeManager, "CuurentTheme.Logo", false, DataSourceUpdateMode.Never);
                }
                else
                {
                    // Reset to the default
                    this.DataBindings.Remove(_headerPanelBackgroundImageBinding);
                }

                Invalidate();
            }
        }
    }
0 голосов
/ 22 июля 2016

Я знаю, что этот вопрос довольно старый, но для тех, кто (как и я) все еще заинтересован в создании действительно "тематических" форм Windows, как уже упоминалось выше, WPF очень хорош для создания тем. Также доступно довольно много готовых тем (Google и stackoverflow всегда ваши друзья) для скачивания. Может быть немного кривой обучения из мира проектов Windows Forms, но ИМХО того стоит. Но если вы хотите остаться с простым приложением Windows Forms (как я это сделал), самое простое предложение - создать формы без полей (для FormBorderStyle установлено значение None). Это будет поддерживать большинство стандартных свойств контейнера Windows. Конечно, вам нужно будет создать собственную «тематическую» строку заголовка и границы, но в основном это «тема» формы Windows. Вам также необходимо создать свои собственные методы определения размера и перемещения, но опять же, Google и stackoverflow являются вашими друзьями. Это простое предложение, столь же очевидное, каким оно может быть для некоторых, было для меня огромным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...