Кодирование графического поля из среды выполнения и добавление в него события

#c# #controls #runtime #picturebox

Вопрос:

В формах C# я могу легко добавить PictureBox в режиме дизайна, а затем дважды щелкнуть по событиям наведения курсора мыши и сохранения мыши и изменить цвет фона на красный и синий и т. Д. Я вижу, что на вкладке «Form1Designer.cs» заполняется приведенный ниже код:

         this.pictureBox1 = new System.Windows.Forms.PictureBox();
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
        this.SuspendLayout();
        // 
        // pictureBox1
        // 
        this.pictureBox1.Location = new System.Drawing.Point(203, 56);
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(417, 273);
        this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.MouseLeave  = new System.EventHandler(this.pictureBox1_MouseLeave);
        this.pictureBox1.MouseHover  = new System.EventHandler(this.pictureBox1_MouseHover);
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(800, 450);
        this.Controls.Add(this.pictureBox1);
        this.Name = "Form1Hover";
        this.Text = "Form1Hover";
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
        this.ResumeLayout(false);
 

Однако я должен делать это во время выполнения, поэтому, когда кто-то смотрит на форму дизайна, в ней не должно отображаться никакого графического поля. Если я открою новую форму и скопирую и вставлю приведенный выше код во вкладку «Form1Designer.cs», то весь код будет выделен красными ошибками. Так что я не мог заставить это работать здесь.

Я смог успешно выполнить кодирование графических полей во время выполнения, выполнив приведенный ниже код. На вкладке «Form1Designer.cs» я только добавил:

     this.Controls.Add(this.pictureBox1);
 

Во вкладке «Form1.cs» я добавил:

 public partial class Form1 : Form
{
    PictureBox pictureBox1 = new PictureBox(); // got instance of Picture Box here
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.MouseHover  = new EventHandler(this.pictureBox1_MouseHover);
        pictureBox1.MouseLeave  = new EventHandler(this.pictureBox1_MouseLeave);
    }
    private void pictureBox1_MouseHover(object sender, EventArgs e)
    {
        pictureBox1.BackColor = Color.Blue;
    }
    private void pictureBox1_MouseLeave(object sender, EventArgs e)
    {
        pictureBox1.BackColor = Color.Red;
    }
}
 

У меня есть два вопроса,

Вопрос 1: Я думаю, что невозможно написать весь код для создания графических полей и их событий в Form1Designer.cs», это правильно?

Вопрос 2: Мое решение требует, чтобы я получил экземпляр графического поля в «Form1.cs» в самых внешних областях {}; другими словами, как можно более глобально. Я чувствую, что это не очень чистый способ получить экземпляр коробки с картинками, в которой моя форма 1 будет загромождена. Есть ли лучший способ?

Заранее спасибо

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

1. Может быть, вы пропустили строки в сгенерированном дизайнером коде, где pictureBox1 была определена переменная? Например. private System.Windows.Forms.PictureBox picureBox1; ? Может быть, поэтому все линии становятся красными 🙂

2. Form1.Designer-это сгенерированный файл, если вы что-то измените в представлении конструктора, вы потеряете весь свой пользовательский код там. Кроме того, Form1.Designer.cs и Form1.cs являются частичными классами. Это не «становится более глобальным», если picturebox объявлен в Form1.cs, в отличие от Form1.Designer.cs, так как его один и тот же класс в разных файлах.

Ответ №1:

Дизайнер генерирует код для вас. Так что вы вполне можете написать его самостоятельно. Если у вас есть ошибки, обратите внимание на сообщения, и если вы их не понимаете, обратитесь в Google, это обычно помогает вам в дальнейшем.

Отвечая на ваш второй вопрос: Фиксация уже дала вам хороший ответ. Если вы посмотрите на объявление своего класса, вы увидите, что это частичный класс. сгенерированный дизайнером код объявляет один и тот же частичный класс. эти две (или более, если вы решите) части будут сшиты вместе во время выполнения. Таким образом, частные объявленные члены будут находиться в области действия во всех частях частичного класса. В противном случае сгенерированный дизайнером код также не был бы в области действия.

Если вы опасаетесь, что класс станет слишком загроможденным, просто поищите фрагменты кода, которые можно извлечь в его собственные классы. Вы используете объектно-ориентированный язык и, следовательно, имеете возможность организовать себя

Если вы не хотите видеть picturebox при запуске, но он должен быть показан позже, вы можете изменить свойство visible на false.

Если вы действительно хотите вручную кодировать в поле с картинками, я рекомендую вам внимательно изучить сгенерированный дизайнером код и поэкспериментировать еще немного.