С# задает точку останова на событии рисования, но не может пройти или пропустить при отладке?

Я действительно не уверен, что это проблема с моей неопытности с С#, VS 2010, debug,.net или событиями в целом, поэтому, пожалуйста, будьте со мной. У меня есть проект, рисовавший "Азбучный аквариум". Добавление букв разных цветов на панель, а затем их анимацию. Это простой проект в виде окон, который включает в себя два класса: 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();
 }
}
</fish></fish>

Обратная связь будет оценена и спасибо заранее.

1 ответ

Хотя одношаговая отладка метода рисования, будучи "пойманным" в бесконечном цикле событий рисования, является общей проблемой, если ваше окно программного обеспечения (отлаживаемое) по крайней мере частично перекрывает одну из окон Visual Studio - перекрытие даже одного пикселя может быть достаточно, чтобы вызвать этот симптом.

Случается, что всякий раз, когда вы делаете шаг в отладчике, фокус переключается из окна отладчика в вашу программу. Так как окно программы, которое было хотя бы частично покрыто одной из окон Visual Studio, теперь снова выведено на передний план, оно вызовет событие Paint. Затем фокус переключится обратно на отладчик, который снова (частично) будет закрывать окно программы. Выполняя следующий шаг, вся процедура повторяется, и вы столкнулись с бесконечной последовательностью событий рисования.

Чтобы избежать этой проблемы, убедитесь, что окна Visual Studio и окно программы не касаются.

Если события рисования продолжают продолжаться, хотя отладчик и окна программ разделены пространственно, ваш код запускает событие рисования в других условиях. Примерами типичных кандидатов, которые могут инициировать события рисования, будут обработчики событий, указывающих на окно, которое оно стало активным окном или обработчиками для событий фокуса.

Однако выяснение этого может стать несколько громоздким, если фокус часто переключается между окном отладчика и вашей программой. Если такая проблема заподозрена, рекомендуемый подход заключается в использовании удаленной отладки. Удаленная отладка означает, что программа для отладки работает на другом компьютере/среде, чем отладчик, и, таким образом, полностью не реагирует на пользовательский интерфейс отладчика. Для среды отладки вы можете использовать второй физический компьютер, но часто использование виртуальной машины также является разумным вариантом.

licensed under cc by-sa 3.0 with attribution.