如何根据c#中自定义按钮类的状态提供属性覆盖
本文关键字:状态 覆盖 属性 按钮 何根 自定义 | 更新日期: 2023-09-27 18:17:22
我正在为我的XNA游戏制作一个自定义按钮类。因此,我正在使用c#开发游戏。
我的按钮类是非常基本的,它提供了必要的事件,如MouseOver, MouseOut, MouseDown等…此外,它有一些影响整体外观的公共属性,如Text, TextAlign, BackgroundColor, TextColor和Font。
每个按钮可以在4种不同的状态:正常,悬停,按下和非活动。我希望我的游戏开发者能够指定某些"覆盖",这将在"每个状态基础上"控制按钮的外观。
不幸的是,我想不出一个绝妙的解决办法。目前我只是创建一个数组,它可以为每个状态保存一个单独的Button实例。现在,如果用户想要为hoverated状态创建覆盖,他只需在按钮数组的相应索引位置创建一个新的Button实例(我使用了一个Enumeration用于该映射,它将被转换为字节值以检索正确的索引位置)。现在,用户可以为每个可能的状态<->属性组合定义覆盖。
在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; }
}
现在用户可以使用您的自定义按钮并更改设置
希望能有所帮助
我的想法类似于punker76,但要添加它,不要忘记精灵表。
你可以有一个带有四个空按钮的单一按钮表,只要在状态改变时移动SourceRectangle。而不是为"一个按钮"保存4个不同的按钮实例,每个按钮拥有4组设置(我猜也是在一个数组中),以及每个状态下按钮所需形状的单个精灵表。
在此之上,你可以让按钮自己绘制而不是在主绘制方法中使用任何按钮逻辑