C# 如何根据C中自定义按钮类的状态提供属性覆盖#

C# 如何根据C中自定义按钮类的状态提供属性覆盖#,c#,button,attributes,state,overwrite,C#,Button,Attributes,State,Overwrite,我正在为我的XNA游戏开发一个自定义按钮类。因此,我正在用C#开发这个游戏 我的button类是非常基本的,它提供了诸如MouseOver、MouseOut、MouseDown等必需的事件。。。此外,它还有一些影响整体外观的公共属性,如文本、文本对齐、背景色、文本颜色和字体 每个按钮可以处于4种不同的状态:正常、悬停、按下和非活动。我想让我的游戏开发者有可能指定某些“覆盖”,这将在“每个州”的基础上控制按钮的外观 不幸的是,我不能想出一个奇特的解决办法。目前,我只是创建了一个数组,它可以为每个状

我正在为我的XNA游戏开发一个自定义按钮类。因此,我正在用C#开发这个游戏

我的button类是非常基本的,它提供了诸如MouseOver、MouseOut、MouseDown等必需的事件。。。此外,它还有一些影响整体外观的公共属性,如文本、文本对齐、背景色、文本颜色和字体

每个按钮可以处于4种不同的状态:正常、悬停、按下和非活动。我想让我的游戏开发者有可能指定某些“覆盖”,这将在“每个州”的基础上控制按钮的外观

不幸的是,我不能想出一个奇特的解决办法。目前,我只是创建了一个数组,它可以为每个状态保存一个单独的按钮实例。现在,如果用户想要为悬停状态创建覆盖,他只需在按钮数组的相应索引位置创建一个新的按钮实例(我使用了一个枚举用于该映射,该映射将转换为字节值以检索正确的索引位置)。现在,用户可以为每个可能的stateproperty组合定义覆盖

在draw方法中,我最终检查按钮的当前活动状态,并从数组集合中绘制适当的按钮实例

不过,这不是一个非常干净的解决方案,因为如果我只想覆盖单个状态的TextColor,它会产生大量开销。我想知道如何在更专业的解决方案中解决这一问题


有没有人有一些关于设计模式的技巧,在那个领域可能有用?我在搜索解决方案时遇到问题,因为我缺少有意义的关键字。

您可以尝试实现自己的设置类

编辑

public class ButtonSettings
{
  private ButtonSettings parentSettings;

  public void ButtonSettings(ButtonSettings parent)
  {
    parentSettings = parent;
    if (parent == null)
    {
      // initialize default values
      TextAlign = TextAlign.Left;
      // ...
    }
  }

  private Alignement textAlign = null;
  public Alignement TextAlign
  {
    get { return textAlign != null ? textAlign : (parentSettings != null ? parentSettings.TextAlign : default(Alignement)); };
    set { textAlign = value; };
  }

  // do the same as TextAlign ...
  public Color BackgroundColor { get; set; }
  public Color TextColor { get; set; }
  public Font Font { get; set; }
}


public enum ButtonState
{
  Normal,
  Hovered,
  Pressed
  Inactive
}
在你的按钮课上使用它

public class CustomButton : Button
{
  public CustomButton ()
  {
    // initialize your settings
    Normal = new ButtonSettings();
    Hovered = new ButtonSettings(Normal);
    Pressed = new ButtonSettings(Normal);
    Inactive = new ButtonSettings(Normal);

    State = ButtonState.Normal;
  }

  public ButtonSettings Normal { get; set; }
  public ButtonSettings Hovered { get; set; }
  public ButtonSettings Pressed { get; set; }
  public ButtonSettings Inactive { get; set; }

  public ButtonState State { get; set; }
}
现在,用户可以使用自定义按钮更改设置


希望这有帮助

我的想法与朋克76相似,但更重要的是,别忘了雪碧床单

您可以有一个包含四个空按钮的单按钮表,并且只要在状态更改时移动SourceRectangle即可。每个按钮不是为“一个按钮”保存四个不同的按钮实例,而是为每个状态保存四组设置(我猜也是在一个数组中),并以所需的按钮形状保存单个精灵表


除此之外,您还可以让按钮自行绘制,而不是在主绘制方法中使用任何按钮逻辑。

这肯定会减少开销,但我仍然需要维护四个设置实例。考虑过拥有一个类似于字典集合的东西,其中每个KeyValuePair都可以表示覆盖,但我很难让它真正通用。。。我希望能有更多的建议,但我想你的建议是最容易实现的。我对你的解决方案@punker76做了一些研究。我缺少的一个特性类似于属性层次结构。因此,悬停和活动设置更像是正常状态的子样式。当普通设置实例的某个属性发生更改(该属性未被悬停状态覆盖)时,该属性也应随之更改。我试图用事件方法实现它,但这很快就会变得丑陋和容易出错,因为我必须跟踪哪个属性是覆盖,哪个不是覆盖。@Daniel我已将一些内容更改为您的新问题