Содержимое на первой вкладке исчезает после добавления другой вкладки C # winforms - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно написать приложение для рисования с несколькими вкладками.Приложение состоит из кнопки, которая добавляет вкладки и элемент управления вкладками (каждая вкладка имеет один PictureBox).Когда я нажимаю на кнопку, новая вкладка с PictureBox добавляется к TabControl.Проблема возникает, когда я добавляю новую вкладку и добавляю ее в TabControl: рисунки на выбранной вкладке исчезают.Я попытался отладить его, но не могу найти определенную строку кода, из-за которой исчезает содержание PictureBox (содержимое выбранной вкладки исчезает при вызове tabControl.Controls.Add(tab);.

Ниже приведен кодобработчик события:

   private void AddTabButton_Click(object sender, EventArgs e)
    {
        TabPage tab = new TabPage();
        tab.Name = DateTime.Now.Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds.ToString();
        tab.Text = DateTime.Now.ToString();
        PictureBox p = new PictureBox();
        p.ClientSize = new Size(613, 244);
        p.BackColor = Color.White;
        p.MouseDown += (a, b) =>
        {
            var checkedFigureButton = FigurePanel.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked);
            var checkedColorButton = ColorPanel.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked);
            if (checkedColorButton.Text != null)
            {
                System.Drawing.Color color;
                switch (checkedColorButton.Text)
                {
                    case "Red":
                        color = Color.Red;
                        break;
                    case "Green":
                        color = Color.Green;
                        break;
                    case "Blue":
                        color = Color.Blue;
                        break;
                    default:
                        color = Color.Black;
                        break;
                }
                switch (checkedFigureButton.Text)
                {
                    case "Casual":
                        figure = new Casual(this.tabControl.SelectedTab.Controls[0].CreateGraphics(), color, b.X, b.Y);
                        break;
                    case "Line":
                        figure = new Line(this.tabControl.SelectedTab.Controls[0].CreateGraphics(), color, b.X, b.Y, b.X, b.Y);
                        break;
                    case "Rectangle":
                        figure = new Rectangle(this.tabControl.SelectedTab.Controls[0].CreateGraphics(), color, b.X, b.Y, b.X, b.Y);
                        break;
                    default:
                        break;
                }
                figure.UpdateCurrentPosition(b.X, b.Y);
            }
        };
        p.MouseUp += (a, b) =>
        {
            figure.Release((PictureBox)this.tabControl.SelectedTab.Controls[0]);
            figure = null;
        };
        p.MouseMove += (a, b) =>
        {
            if (figure != null)
            {
                figure.Move(b, (PictureBox)this.tabControl.SelectedTab.Controls[0]);
            }
        };
        tab.Controls.Add(p);
        tabControl.Controls.Add(tab); // after this function is being called (and exit from the event) the content of PictureBox on selected tab disappears
    }

1 Ответ

0 голосов
/ 12 мая 2019

Я бы сделал Интерфейс под названием Figure, который будут реализованы всеми вашими фигурами. Для этого интерфейса потребуется метод Draw(), который получает графику для рисования:

public interface Figure
{
    void Draw(Graphics G);
}

Вот пример реализации интерфейса класса Line Рисунок:

public class Line : Figure
{
    public void Draw(Graphics G)
    {
        // ... draw with "G" in here ...
    }
}

Повторите для каждого типа фигуры, очевидно, соответственно настраивая метод рисования.

Теперь в событии MouseDown вашего PictureBox, где вы создаете «figure», сохраните ссылку на «figure» в свойстве Tag() PB. Вы можете привести свой параметр "a" к типу Control, чтобы добиться этого:

p.MouseDown += (a, b) =>
{
    // ... existing code that creates "figure" ...
    Control ctl = (Control)a;
    ctl.Tag = figure;
};

Затем в событии Paint () вашего PictureBox вы можете привести свойство Tag() к типу Figure и вызвать Draw(). Опять же, вы сначала приведете параметр «a» к типу Control или PictureBox. Передайте предоставленную вам графику через параметр "b" :

p.Paint += (a, b) =>
{
    Control ctl = (Control)a;
    Figure figure = (Figure)ctl.Tag;
    figure.Draw(b.Graphics);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...