2013-12-02 3 views
0

В моем приложении у меня есть возможность немного настроить отображение. В основном, теперь речь идет об изменении изображений кнопок и изображений, изменении значков формы и т. Д. Как вы можете видеть в коде, приведенном ниже. Таким образом, в данном случае, я сделал это, просто загружая кучу ресурсов (изображений), а затем, когда я меняю тему:Изменение кнопок и картинок «BackColor во всех формах»

if (Properties.Settings.Default.Theme == "Purple") 
{ 
    foreach (var form in Application.OpenForms.Cast<Form>()) 
    { 
     form.Icon = Properties.Resources.Purple; 
    } 

    Main f1 = (Main)Application.OpenForms["Main"]; 
    Settings f2 = (Settings)Application.OpenForms["Settings"]; 

    f1.btn_Exit.Image = Properties.Resources.EXIT_purple; 
    f2.btn_SaveSettings.Image = Properties.Resources.SaveSettings_purple; 

    f1.pictureBox1.Image = Properties.Resources.Preview_purple; 
} 

Это значительно увеличивает размер приложения, поэтому я пришел с изменением BackColor вместо загрузки других изображений. Я попытался решить эту проблему следующим образом:

if (Properties.Settings.Default.Theme == "Purple") 
{ 
    foreach (var form in Application.OpenForms.Cast<Form>()) 
    { 
     form.Icon = Properties.Resources.Purple; 
    } 

    Main f1 = (Main)Application.OpenForms["Main"]; 
    Settings f2 = (Settings)Application.OpenForms["Settings"]; 

    f1.btn_Exit.BackColor = Color.FromArgb(164, 57, 226); 
    f2.btn_SaveSettings.BackColor = Color.FromArgb(164, 57, 226); 

    f2.pictureBox1.BackColor = Color.FromArgb(164, 57, 226); 
} 

Таким образом, форма значок должен быть изменен на всех запущенных формах и мне удалось успешно сделать это, но когда дело доходит до кнопок и PictureBoxes, я не являюсь видя любые результаты, то есть кнопки и графические ящики просто не меняются. Помимо значков формы, я должен изменить btn_Exit, расположенный на форме Main, btn_SaveSettings, расположенной на форме Settings, и pictureBox1, расположенной на форме Settings.

Как я могу решить эту проблему?

+0

Что такое 'btn_Exit'? Свойство 'Main' возвращает что? И идея с Themeing немного неправильна, представьте, что у вас есть 100 форм и 10 кнопок на каждом .. должен быть довольно какой-то интерфейс или компонент, похожий на свойство «ToolTip», прикрепляющее «Themeable = true» и регистрирующий элемент управления, поэтому вы просто проходите все зарегистрированные элементы управления в одном цикле и сразу меняют свои свойства. – Sinatr

+0

btn_Exit - кнопка, расположенная в форме с именем Main. Я не знаю, как точно ответить на этот вопрос. В любом случае, я вижу, откуда вы, и я знаю, что это не лучшее решение, но оно работает для меня. Есть ли у вас какие-либо предложения, как я могу получить желаемые результаты в моем случае? –

+0

Я попытаюсь угадать, какие рисунки покрывают всю область кнопок или pictureBoxes, поэтому вы не видите результат изменения 'BackColor'. – Sinatr

ответ

0

Если бы это был я, я бы сделал интерфейс. Этот интерфейс будет иметь ссылку на правильный рисунок/значок/цвет для разных элементов управления. Приложение «Настройки для вашего приложения» будет содержать экземпляр правильной темы. В каждой форме я бы OnLoad обновил все необходимые элементы и назвал это днем. Это, наверное, не самое изящное решение, но было бы легко и быстро, когда вы добавите больше тем.

Это то, о чем я думал. Надеюсь, это прояснит мой подход.

public class Settings 
{ 
    public static ITheme Theme {get {return theme;}{set theme = value}} 

    theme = new DefaultTheme(); 
} 
public interface ITheme 
{ 
    public Color BackgroundColor {get;} 
    public Color ButtonBackgroundColor { get;} 

    //... etc 
} 
public class DefaultTheme : ITheme 
{ 
    public Color BackgroundColor {get{ return Color.White;}} 
    public Color ButtonBackgroundColor { get { return Color.Gray;}} 

} 

отсюда у вас есть 2 подхода. Оба требуют, чтобы вы поместили событие «OnLoad». Если у вас есть 1 или 2 формы, возможно, этот код должен содержать каждую форму (не рекомендуется), или вы можете использовать метод расширения.

здесь первый подход. поместите код непосредственно в каждый кадр.

public class SaveFrame : Frame 
{ 
    public SaveFrame() 
    { 
     InitializeComponents(); 
    } 
    public Form_OnLoad() 
    { 
     var theme = Settings.Theme; 

     this.Background = theme.BackgroundColor; 
     foreach(Button b in this.Controls) 
     { 
      if(b != null) 
       b.Background = theme.ButtonBackgroundColor; 
     } 
    } 

} 

или создать метод расширения. и положить его в OnLoad

public static class FormExtensions 
{ 
    public static void UpdateTheme(this Form form, ITheme theme) 
    { 
     form.Background = theme.BackgroundColor; 
     foreach(Button b in form.Controls) 
     { 
      if(b != null) 
       b.Background = theme.ButtonBackgroundColor; 
     } 

    } 
} 
public class SaveFrame : Form 
{ 
    public SaveFrame() 
    { 
     InitializeComponents(); 
    } 
    public Form_OnLoad() 
    { 
     this.UpdateTheme(Settings.Theme); 
    } 
} 
public class MainFrame :Form 
{ 
    public MainFrame() 
    { 
     InitializeComponents(); 
    } 
    public Form_OnLoad() 
    { 
     this.UpdateTheme(Settings.Theme); 
    } 
} 
+0

Да, я знаю, что это не лучшее решение , но это работает для меня. Вы знаете, как я могу решить проблему в моем случае? –

+0

см. Редактирование. Надеюсь, это прояснит ситуацию. Я не проверял свою работу, поэтому будьте осторожны с копированием и вставкой. –

Смежные вопросы