簡體   English   中英

通過引用而不是值分配Color(Struct)對象

[英]Assigning Color(Struct) object by reference instead of value

我在XNA中使用大量的顏色。 所有這些顏色都來自Theme類,其中包含當前主題的可能顏色。

這些顏色在SpriteBatch.Draw()中用作疊加層,並使用白色紋理(1.1 px)。

用戶可以選擇在運行時更改此主題,然后將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);

您可以在類中包含應用程序主題顏色,並在每次將結構傳遞到某個地方時訪問該結構的類副本。 當然,結構和顏色本身仍將是值類型,但是據我所知,重要的一點是訪問顏色的相同副本。

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

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

然后將這些方法傳遞給方法的方式可能無法更改(除非代碼是您自己的),但是顏色的來源很重要。 只要您每次從容器中獲取容器並根據主題更改來更新容器,更改都會在整個系統中泛濫。

在您的控件中,以這種方式更改您的Color屬性...

class Control
{
     public int UseThemeColor = -1;    

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM