using System.Drawing; using System.Windows.Forms; namespace Vanara.Windows.Forms; /// Represents an image used within a control. public class ControlImage { private Image? image; private string imageKey = string.Empty; private ImageList? imageList; private int index = -1; private bool useIntegerIndex = true; /// Initializes a new instance of the class. /// The parent. public ControlImage(Control parent) => Control = parent; /// Gets or sets the image. /// The image. public virtual Image? Image { get { if (image == null && imageList != null) { int actualIndex = ActualIndex; if (actualIndex >= imageList.Images.Count) actualIndex = imageList.Images.Count - 1; if (actualIndex >= 0) return imageList.Images[actualIndex]; } return image; } set { if (image == value) return; image = value; if (image != null) { ImageIndex = -1; ImageList = null; Control?.Invalidate(); } } } /// Gets or sets the index of the image. /// The index of the image. /// ImageIndex public virtual int ImageIndex { get { if (index != -1 && imageList != null && index >= imageList.Images.Count) return imageList.Images.Count - 1; return index; } set { if (value < -1) throw new ArgumentOutOfRangeException(nameof(ImageIndex)); if (index == value) return; if (value != -1) image = null; imageKey = string.Empty; index = value; useIntegerIndex = true; Control?.Invalidate(); } } /// Gets or sets the image key. /// The image key. public virtual string ImageKey { get => imageKey; set { if (imageKey == value) return; index = -1; if (value != null) image = null; imageKey = value ?? string.Empty; useIntegerIndex = false; Control?.Invalidate(); } } /// Gets or sets the image list. /// The image list. public virtual ImageList? ImageList { get => imageList; set { if (imageList == value) return; if (imageList != null) imageList.RecreateHandle -= ImageListOnRecreateHandle; if (value != null) image = null; imageList = value; if (imageList != null) imageList.RecreateHandle += ImageListOnRecreateHandle; Control?.Invalidate(); } } /// Gets the actual index. /// The actual index. protected virtual int ActualIndex { get { if (useIntegerIndex) return ImageIndex; if (ImageList != null) return ImageList.Images.IndexOfKey(ImageKey); return -1; } } /// Gets or sets the control. /// The control. protected Control Control { get; set; } private void ImageListOnRecreateHandle(object? sender, EventArgs eventArgs) { if (Control?.IsHandleCreated ?? false) Control.Invalidate(); } }