我正在创建一个自定义控件,它是一个按钮。它可以根据其类型具有类型和指定的图像。它的类型可能是:
public enum ButtonType
{
PAUSE,
PLAY
}
现在我可以用一种方法改变它的外观和图像:
public ButtonType buttonType;
public void ChangeButtonType(ButtonType type)
{
// change button image
if (type == ButtonType.PAUSE)
button1.Image = CustomButtonLibrary.Properties.Resources.PauseButton;
else if (type == ButtonType.PLAY)
button1.Image = CustomButtonLibrary.Properties.Resources.PlayButton;
buttonType = type;
}
好的,这个方法看起来不太好,例如可能以后我希望有另一个类型STOP
例如这个按钮,我只想将它的图像添加到资源并将其添加到{{1枚举,无需更改此方法。
如何实施此方法以与未来的更改兼容?
答案 0 :(得分:3)
您可以做的一件事是将ButtonType
转换为基类(或者如果您愿意,可以使用界面):
public abstract class ButtonType
{
public abstract Image GetImage();
}
然后你的每个类型都成为一个子类:
public class PauseButtonType : ButtonType
{
public Image GetImage()
{
return CustomButtonLibrary.Properties.Resources.PauseButton;
}
}
public class PlayButtonType : ButtonType
{
public Image GetImage()
{
return CustomButtonLibrary.Properties.Resources.PlayButton;
}
}
然后您的图像更改方法变为:
private ButtonType buttonType; // public variables usually aren't a good idea
public void ChangeButtonType(ButtonType type)
{
button1.Image = type.GetImage();
buttonType = type;
}
这样,当您想要添加其他类型时,可以添加另一个ButtonType子类并将其传递给ChangeButtonType
方法。
<小时/> 由于此方法在您的自定义按钮类上,我可能会更进一步,并将样式/外观封装在类中:
public class ButtonStyle
{
// might have other, non-abstract properties like standard width, height, color
public abstract Image GetImage();
}
// similar subclasses to above
然后按钮本身:
public void SetStyle(ButtonStyle style)
{
this.Image = style.GetImage();
// other properties, if needed
}
您可以使用ButtonAction基类以类似的方式设置按钮行为(即,点击它们时执行的操作),并在您想要更改按钮的用途和样式时指定停止和播放等特定操作。
答案 1 :(得分:2)
不知道这是否是最佳选择,但您可以为枚举创建自定义属性,包含图像
public enum ButtonType
{
[ButtonImage(CustomButtonLibrary.Properties.Resources.PauseButton)]
PAUSE,
[ButtonImage(CustomButtonLibrary.Properties.Resources.PlayButton)]
PLAY
}
我不会详细介绍这个,因为这很容易谷歌...事实上,这是一个很好的资源开始: