C#在paint事件上设置断点但在调试时无法单步执行或过去?

时间:2013-11-15 06:24:23

标签: c# debugging events paint step-into

我真的不确定这是否是我对C#,VS 2010,调试,.net或一般事件缺乏经验的问题,所以请耐心等待。我有一个绘制字母水族馆的项目。将不同颜色的字母添加到面板,然后为它们设置动画。这是一个简单的Windows窗体项目,包括两个类,Fishtank和Fish。绘制事件用于绘制彩色字母,我们的任务是为它们设置动画。为了理解paint事件如何使用具有初始加载和控件的类,我设置了一个断点。通过断点,我无法单步执行绘制事件。没有断点,程序加载?这是我的经验,代码,调试或什么??

的问题
     private void fishTankPanel_Paint(object sender, PaintEventArgs e)
    {
        // Loop through each fish in our fish tank, and draw them.
        for (int i = 0; i < _fishTank.CountFish(); i++)
        {
            Fish fish = _fishTank.GetFish(i);
            e.Graphics.DrawString(fish.FishLetter, new Font("Arial", 10),
                new SolidBrush(fish.FishColor), new Point(fish.XPosition, fish.YPosition));
        }
        fishCountLabel.Text = _fishTank.CountFish().ToString();

    }

class Fish
{
    private Color _fishColor;
    public Color FishColor
    {
        get { return _fishColor; }
        set { _fishColor = value; }
    }

    private int _xPosition;
    public int XPosition
    {
        get { return _xPosition; }
        set { _xPosition = value; }
    }

    private int _yPosition;
    public int YPosition
    {
        get { return _yPosition; }
        set { _yPosition = value; }
    }

    private string _fishLetter;
    public string FishLetter
    {
        get { return _fishLetter; }
        set { _fishLetter = value; }
    }

    private string _direction;
    public string Direction
    {
        get { return _direction; }
        set { _direction = value; }
    }
    public Fish(string fishLetter, int xPosition, int yPosition, Color fishColor, string fishDirection)
    {
        // If no letter specified, use "X."
        if (fishLetter.Length == 0)
        fishLetter = "X";
        _fishLetter = fishLetter;

        // Ensure the position is >= 0.
        if (xPosition < 0)
        xPosition = 0;
        _xPosition = xPosition;

        if (yPosition < 0)
        yPosition = 0;
        _yPosition = yPosition;

        // Set the fish color.
        _fishColor = fishColor;

        // Set fish direction

    }
}class FishTank
{
    // Use a List collection to hold the fish.
    private List<Fish> _fishTank = new List<Fish>();
    public int CountFish()
    {
        return _fishTank.Count;
    }
    public Fish GetFish(int position)
    {
        return _fishTank[position];
    }
    public void AddFish(Fish fish)
    {
        _fishTank.Add(fish);
    }
    public void ClearFish()
    {
        _fishTank.Clear();
    }
}

反馈将受到赞赏,并提前感谢。

1 个答案:

答案 0 :(得分:2)

虽然单步调试绘制方法,但如果您的软件窗口(正在调试的窗口)与Visual Studio的某个窗口至少部分重叠,则在看似无限的绘制事件循环中“捕获”是一个常见问题 - 甚至一个像素的重叠可能足以触发此症状。

无论何时在调试器中执行某个步骤,焦点都会从调试器窗口切换到您的程序。由于程序窗口(至少部分由Visual Studio窗口之一覆盖)现在再次出现在前台,因此它将触发Paint事件。然后焦点将切换回调试器,调试器将再次(部分)覆盖程序窗口。执行下一步,整个过程重复进行,你面临着一个看似永无止境的油漆事件序列。

要避免此问题,请确保Visual Studio窗口和程序窗口不要触摸

如果虽然调试器和程序窗口在空间上是分开的,但仍然会继续发生绘制事件,您的代码也会在其他条件下触发绘制事件。可能触发绘制事件的典型候选者的示例将是事件的处理程序,告诉窗口它已成为活动窗口或焦点事件的处理程序。

但是,如果焦点经常在调试器窗口和程序之间切换,那么解决这个问题可能会变得有些麻烦。如果怀疑有这样的问题,推荐的方法是使用远程调试。远程调试意味着要调试的程序在与调试器不同的机器/环境上运行,因此完全不受调试器UI的干扰。对于调试环境,您可能使用第二台物理计算机,但通常使用虚拟机也是一种合理的选择。