Работа с ресурсами и пользовательскими свойствами элементов управления

#c# #winforms #coding-style #methods

#c# #winforms #стиль кодирования #методы

Вопрос:

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

 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 enum, не меняя этот метод.

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

Комментарии:

1. Где ChangeButtonType метод? Это на вашей пользовательской кнопке?

2. @Anna: да, это библиотека элементов управления, и этот метод, и это перечисление, и все это есть.

Ответ №1:

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


Поскольку этот метод относится к вашему пользовательскому классу button, я бы, вероятно, пошел немного дальше и инкапсулировал стиль / внешний вид в классе:

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

Ответ №2:

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

 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