我真的不确定这是否是我对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();
}
}
反馈将受到赞赏,并提前感谢。
答案 0 :(得分:2)
虽然单步调试绘制方法,但如果您的软件窗口(正在调试的窗口)与Visual Studio的某个窗口至少部分重叠,则在看似无限的绘制事件循环中“捕获”是一个常见问题 - 甚至一个像素的重叠可能足以触发此症状。
无论何时在调试器中执行某个步骤,焦点都会从调试器窗口切换到您的程序。由于程序窗口(至少部分由Visual Studio窗口之一覆盖)现在再次出现在前台,因此它将触发Paint事件。然后焦点将切换回调试器,调试器将再次(部分)覆盖程序窗口。执行下一步,整个过程重复进行,你面临着一个看似永无止境的油漆事件序列。
要避免此问题,请确保Visual Studio窗口和程序窗口不要触摸。
如果虽然调试器和程序窗口在空间上是分开的,但仍然会继续发生绘制事件,您的代码也会在其他条件下触发绘制事件。可能触发绘制事件的典型候选者的示例将是事件的处理程序,告诉窗口它已成为活动窗口或焦点事件的处理程序。
但是,如果焦点经常在调试器窗口和程序之间切换,那么解决这个问题可能会变得有些麻烦。如果怀疑有这样的问题,推荐的方法是使用远程调试。远程调试意味着要调试的程序在与调试器不同的机器/环境上运行,因此完全不受调试器UI的干扰。对于调试环境,您可能使用第二台物理计算机,但通常使用虚拟机也是一种合理的选择。