Я создаю программу WinForm на C#, и я хочу настроить ее скин или интерфейс с помощью PNG или других файлов изображений. Меня интересуют не только кнопки, но и фон, индикатор выполнения и другие элементы управления. Я понимаю из большинства моих исследований, что TransparentKey используется для формы неправильной формы, тогда панель поддерживает прозрачность PNG.C# - Пользовательский интерфейс из изображения
Мой вопрос: Мне было интересно, есть ли лучший способ, реальный и рекомендуемый способ, реализовать пользовательский интерфейс для моей программы.
В моем текущем коде используется свойство BackgroundImage для замены изображения. Но я верю, что это не так, как я должен это делать.
Вот кусок мой текущий код:
public List<Image> BaseImage = new List<Image>();
public List<Image> ClickedImage = new List<Image>();
public List<object> ControlAction = new List<object>();
public List<Image> HoverImage = new List<Image>();
private int counter = 0;
public Control CreatePanel(Image BaseImage, Image HoverImage, Image ClickedImage,
string Name, int x, int y, ButtonAction action)
{
this.BaseImage.Add(BaseImage);
this.HoverImage.Add(HoverImage);
this.ClickedImage.Add(ClickedImage);
int width = BaseImage.Width;
int height = BaseImage.Height;
Actions Action = new Actions();
EventHandler SelectedAction = null;
switch (action)
{
case ButtonAction.Cancel:
SelectedAction = Action.Cancel;
break;
case ButtonAction.Exit:
SelectedAction = Action.Exit;
break;
case ButtonAction.Minimize:
SelectedAction = Action.Minimize;
break;
case ButtonAction.Open:
SelectedAction = Action.Open;
break;
case ButtonAction.Pause:
SelectedAction = Action.Pause;
break;
case ButtonAction.Start:
SelectedAction = Action.Start;
break;
}
Simplify.Invoke(() =>
{
this.newPanel.SuspendLayout();
this.newPanel.Location = new System.Drawing.Point(x, y);
this.newPanel.Name = Name;
this.newPanel.TabIndex = counter;
this.newPanel.Size = new System.Drawing.Size(width, height);
this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255);
this.newPanel.BackgroundImage = this.BaseImage[counter];
this.newPanel.Click += new EventHandler(SelectedAction);
this.newPanel.MouseEnter += new EventHandler(PanelHover);
this.newPanel.MouseDown += new MouseEventHandler(PanelClicked);
this.newPanel.MouseLeave += new EventHandler(PanelLeave);
this.newPanel.ResumeLayout(false);
});
ControlAction.Add(action);
counter += 1;
return newPanel;
}
private void PanelClicked(object sender, MouseEventArgs e)
{
this.newPanel.SuspendLayout();
this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255);
this.newPanel.BackgroundImage = ClickedImage[newPanel.TabIndex];
this.newPanel.Size = new Size(ClickedImage[newPanel.TabIndex].Width, ClickedImage[newPanel.TabIndex].Height);
this.newPanel.ResumeLayout(false);
}
private void PanelHover(object sender, EventArgs e)
{
this.newPanel.SuspendLayout();
this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255);
this.newPanel.BackgroundImage = HoverImage[newPanel.TabIndex];
this.newPanel.Size = new Size(HoverImage[newPanel.TabIndex].Width, HoverImage[newPanel.TabIndex].Height);
this.newPanel.ResumeLayout(false);
}
private void PanelLeave(object sender, EventArgs e)
{
this.newPanel.SuspendLayout();
this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255);
this.newPanel.BackgroundImage = BaseImage[newPanel.TabIndex];
this.newPanel.Size = new Size(BaseImage[newPanel.TabIndex].Width, BaseImage[newPanel.TabIndex].Height);
this.newPanel.ResumeLayout(false);
}
Мой код выше создает панель, которая функционирует как кнопка. Его действие берется из класса Действия, которые в основном просто назначают метод, назначаемый при щелчке пользователем. Я меняю состояние управления, заменяя его BackgroundImage, в то же время изменяя его размер, чтобы избежать получения обрезанной области.
Заранее спасибо.
Дополнительная информация - Я использую .NET Framework 2.0
Да, я испытал эту мерцающую проблему, но мне удалось решить ее, сделав DoubleBuffer. Кроме того, я использую .NET Framework 2.0. Разве нет альтернативного пути? Хотя я попытаюсь изучить WPF, если это действительно рекомендуется. – CudoX
Вы не сможете использовать двойную буферизацию во всех элементах управления. Я пережил это в прошлом. Если вам действительно нужен интерфейс, богатый графикой, рекомендуется WPF. –
Я понимаю. Я просмотрел несколько видеороликов и прочитал много статей и статей о WPF. Кажется, что это действительно рекомендуется для настройки графических интерфейсов. Я буду переносить свой проект на .NET Framework 3.0 вместо этого, чтобы использовать WPF. Большое спасибо за ваши ответы. – CudoX