Назначение объекта Color (Struct) по ссылке вместо значения - PullRequest
1 голос
/ 28 марта 2012

Я использую множество цветов в XNA.Все эти цвета взяты из класса Theme, который содержит возможные цвета для текущей темы.

Эти цвета используются в SpriteBatch.Draw () в качестве наложения, используя белую текстуру (1,1 пикселя).

У пользователя есть возможность изменить эту тему во время выполнения, тогда цвета класса Theme будут переназначены.

Однако, поскольку Color является структурой, все, что я ему назначил, получаетновая копия этого объекта.

Проблема в том, что если я изменю исходные цвета, изменения не будут отражены.Есть ли способ передать цвета по ссылке?Или другое решение?

Дополнительная информация:

Класс моей темы:

/// <summary>
    /// Theme enumerator
    /// </summary>
    public enum Theme
    {
        Standard = 1, Blue, Dark
    }

    public class ThemeColor
    {

        //TODO: Refactor this out
        private readonly SmartHome _gameRef;

        public Color FBlue;
        public Color FDarkGrey;
        public Color FGreen;
        public Color FLightBlue;
        public Color FLightGrey;
        public Color FOrange;
        public Color FWhite;

        public ThemeColor(SmartHome gameref)
        {
            Dal.Instance.Setting.OnChangedSetting += ChangedColor;

            FBlue = new Color(0, 114, 186);
            FDarkGrey = new Color(107, 108, 110);
            FGreen = new Color(140, 189, 70);
            FLightBlue = new Color(0, 179, 231);
            FLightGrey = new Color(233, 233, 234);
            FOrange = new Color(241, 142, 0);
            FWhite = Color.White;
        }

        /// <summary>
        /// Called if a setting is changed, checks if this setting is a theme setting,
        /// if so, change the colors
        /// </summary>
        /// <param name="setting">Changed setting</param>
        public void ChangedColor(Setting setting)
        {
            if (setting.Key == "Theme")
            {

                switch ((Theme)Int32.Parse(setting.Value))
                {
                    case Theme.Standard:     
                        FBlue = new Color(0, 114, 186);
                        FDarkGrey = new Color(107, 108, 110);
                        FGreen = new Color(140, 189, 70);
                        FLightBlue = new Color(0, 179, 231);
                        FLightGrey = new Color(233, 233, 234);
                        FOrange = new Color(241, 142, 0);
                        FWhite = Color.White;
                        break;
                    case Theme.Blue:
                        FBlue = new Color(0, 114, 186);
                        FDarkGrey = new Color(107, 108, 110);
                        FGreen = new Color(0, 179, 231);
                        FLightBlue = new Color(241, 142, 0);
                        FLightGrey = new Color(233, 233, 234);
                        FOrange = new Color(140, 189, 70);
                        FWhite = Color.White;
                        break;
                    case Theme.Dark:
                        FBlue = new Color(233, 233, 234);
                        FDarkGrey = new Color(0, 179, 231);
                        FGreen = new Color(107, 108, 110);
                        FLightBlue = new Color(0, 114, 186);
                        FLightGrey = new Color(140, 189, 70);
                        FOrange = new Color(241, 142, 0);
                        FWhite = Color.White;
                        break;
                }
            }
        }
    }

Элемент управления имеет свойство Color и устанавливается следующим образом: control ctrl.Color = ThemeColor.FGreen

Затем в контрольном классе: SpriteBatch.Draw(x,x,Color);

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Вы можете содержать цвета темы приложения в классе и получать доступ к копии класса структуры каждый раз, когда вы передаете ее куда-нибудь. Конечно, структура и сам цвет останутся типом значения, но, насколько я могу судить, важный бит - это доступ к одной и той же копии цвета.

public static class ColourContainer
{
    public static Color ThemeColour { get; }

    public static void UpdateTheme(Color newColour)
    {
        // Update, etc.
    } 
}

То, как они затем передаются в методы, вероятно, не может измениться (если код не ваш), но источник цвета - это то, что важно. Если вы каждый раз получаете его из контейнера и обновляете контейнер при смене темы, это изменение должно распространяться по всей системе.

0 голосов
/ 28 марта 2012

В вашем управлении измените свойство Color таким образом ...

class Control
{
     public int UseThemeColor = -1;    

     public Color Color { 
         get { return (UseThemeColor==-1 ? _color : ThemeColor.GetByIndex(UseThemColor); } 
         set { _color = value; UseThemColor = -1; }
     }
}
...