我有两个用户控件。第一个,称为"指标"是一个使用OnPaint(...)绘制正方形的简单控件;第一个UserControl中没有错误的地方。
public partial class Indicator : UserControl
{
public Indicator()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.FillRectangle(Brushes.Black, 0,0,this.Width,this.Height);
}
}
第二个是测试控件,由一个面板组成,其中包含一个图片框和第一个用户控件。
public partial class testIndicator: UserControl
{
private static Bitmap bmp;
public Indicator()
{
InitializeComponent();
loadImage();
pictureBox.Image = bmp;
indicator.BringToFront();
}
}
当我在对话框中启动测试控件时(从表单中确保程序保持运行),它第一次显示正常。但是,如果对话框关闭并再次打开(程序仍在运行时),指示器上的OnPaint方法不会被触发。
如果在没有面板的情况下将指示器放置到UserControl上,它可以正常工作。
为了清楚起见,我已尝试在测试时手动运行Invalidate()和Invalidate()+ Update(),无需更改。
任何人都可以解释这种行为,或者可能知道一个没有这种问题的类似容器吗?
编辑:错误是如此愚蠢,我甚至没有把它视为一种可能性; PictureBox使用静态图像,我只有一次初始化图像的代码。问题是它有一个" Size largeScaleSize"非静态的对象,与图像一起初始化。由于第二次运行时图像已经存在,因此largeScaleSize不会被初始化,基本上是{0,0}。缩放方法有这一行:
float xRatio = (float)this.tankPanel.Width / (float)largeScaleSize.Width;
//same as "xRatio = this.tankPanel.Width / 0" which is infinity
我只是想知道为什么我从未得到过零分数异常。
答案 0 :(得分:1)
我根据你的描述制作了一个小项目。您可以下载here。 面板锚定到第二个用户控件中的每个边缘。图片框和指示器控件在面板的顶部和底部对接。包含复合用户控件的表单以模态/无模式运行。无法重现错误的行为。