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

本文关键字:状态 覆盖 属性 按钮 何根 自定义 | 更新日期: 2023-09-27 18:17:22

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

我的按钮类是非常基本的,它提供了必要的事件,如MouseOver, MouseOut, MouseDown等…此外,它有一些影响整体外观的公共属性,如Text, TextAlign, BackgroundColor, TextColor和Font。

每个按钮可以在4种不同的状态:正常,悬停,按下和非活动。我希望我的游戏开发者能够指定某些"覆盖",这将在"每个状态基础上"控制按钮的外观。

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

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

这不是一个非常干净的解决方案,虽然,因为它创建了大量的开销,如果我只想覆盖单一状态的TextColor。我想知道在更专业的解决方案中,这通常是如何解决的。

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

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

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

编辑

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; }
}

现在用户可以使用您的自定义按钮并更改设置

希望能有所帮助

我的想法类似于punker76,但要添加它,不要忘记精灵表。

你可以有一个带有四个空按钮的单一按钮表,只要在状态改变时移动SourceRectangle。而不是为"一个按钮"保存4个不同的按钮实例,每个按钮拥有4组设置(我猜也是在一个数组中),以及每个状态下按钮所需形状的单个精灵表。

在此之上,你可以让按钮自己绘制而不是在主绘制方法中使用任何按钮逻辑