【问题标题】:Content on first tab is gone after adding another tab C# winforms添加另一个选项卡后,第一个选项卡上的内容消失了 C# winforms
【发布时间】:2019-09-29 13:27:06
【问题描述】:

我必须编写一个带有多个选项卡的绘图应用程序。该应用程序由一个添加选项卡和选项卡控件的按钮组成(每个选项卡都有一个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
    }

【问题讨论】:

  • 你能在 mouseup 事件中设置断点吗?看起来这可能会在清除内容的地方受到打击。或者写在那个事件中进行调试。
  • 你的错误几乎可以肯定是在figure的构造函数中使用了CreateGraphics()。请改用 PictureBox 的 Paint() 事件。在这种情况下,您将通过e.Graphics 在参数中获得要绘制的图形。

标签: c# visual-studio winforms user-interface


【解决方案1】:

我会创建一个名为FigureInterface,用于实现所有形状。该接口需要一个Draw() 方法来接收要绘制的图形:

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

下面是一个Line类实现接口的例子:

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

对每种类型的形状重复,显然相应地自定义绘制方法。

现在,在创建“figure”的 PictureBox 的 MouseDown 事件中,在 PB 的 Tag() 属性中存储对“figure”的引用。您可以将“a”参数转换为 Control 类型以实现此目的:

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

然后,在 PictureBox 的 Paint() 事件中,您可以将 Tag() 属性转换为类型 Figure 并调用 Draw()。同样,您首先将“a”参数转换为类型 Control 或 PictureBox。通过"b" parameter 传递给您的图形:

p.Paint += (a, b) =>
{
    Control ctl = (Control)a;
    Figure figure = (Figure)ctl.Tag;
    figure.Draw(b.Graphics);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多