如果放在面板中,UserControl不会重新绘制

时间:2014-10-15 20:56:46

标签: c# user-controls repaint

我有两个用户控件。第一个,称为"指标"是一个使用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

我只是想知道为什么我从未得到过零分数异常。

1 个答案:

答案 0 :(得分:1)

我根据你的描述制作了一个小项目。您可以下载here。 面板锚定到第二个用户控件中的每个边缘。图片框和指示器控件在面板的顶部和底部对接。包含复合用户控件的表单以模态/无模式运行。无法重现错误的行为。