【发布时间】: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