Работа с ресурсами и пользовательскими свойствами элемента управления - PullRequest
4 голосов
/ 01 октября 2011

Я создаю пользовательский элемент управления, и это кнопка.Может иметь тип и указанное изображение в соответствии с его типом.Его тип может быть:

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, например, для этой кнопки, я хочу просто добавить его изображение к ресурсам и добавить его к ButtonType перечислению, не меняя этот метод.

Как я могу реализоватьэтот метод будет совместим с будущими изменениями?

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Одна вещь, которую вы можете сделать, это превратить 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 и назначить конкретные действия, такие как Stop и Play, когда вы хотите изменить назначение и стиль кнопки..

2 голосов
/ 01 октября 2011

Не знаю, является ли это лучшим вариантом, но вы можете создать собственное свойство для вашего перечисления, содержащее изображение

public enum ButtonType
{
    [ButtonImage(CustomButtonLibrary.Properties.Resources.PauseButton)]
    PAUSE,

    [ButtonImage(CustomButtonLibrary.Properties.Resources.PlayButton)]
    PLAY
}

Я не буду вдаваться в подробности, так как этолегко для Google ... На самом деле, это хороший ресурс для начала:

http://joelforman.blogspot.com/2007/12/enums-and-custom-attributes.html?showComment=1317161231873#c262630108634229289

...