Конечная цель — несколько играбельная игра на память. В настоящее время я застрял на проблеме рендеринга. У меня есть следующие классы:
Поле, которое является абстрактным UserControl
:
public abstract class Field : UserControl
{
protected PictureBox _pictureBox;
public Field()
{
_pictureBox = new PictureBox();
_pictureBox.Image = Properties.Resources.empty;
_pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
_pictureBox.BorderStyle = BorderStyle.FixedSingle;
this.Controls.Add(_pictureBox);
}
// ...
// some abstract methods, not currently important
}
MemoryField, производное от Field:
public class MemoryField : Field
{
public MemoryField(Form parent, int xPos, int yPos, int xSize, int ySize)
{
_pictureBox.ClientSize = new Size(xSize, ySize);
_pictureBox.Location = new Point(xPos, yPos);
_pictureBox.Parent = parent;
}
// ...
}
И, наконец, MainForm, которая является точкой входа для моего приложения:
public partial class MainForm : Form
{
private readonly int fieldWidth = 100; // 150 no rendering problems at all
private readonly int fieldHeight = 100;
public MainForm() { InitializeComponent(); }
private void MainForm_Load(object sender, EventArgs e)
{
for (int y = 0; y < 6; y++) // 6 rows
{
for (int x = 0; x < 10; x++) // 10 columns
{
Field field = new MemoryField(this,
x * (fieldWidth + 3), // xPos, 3 is for a small space between fields
labelTimer.Location.Y + labelTimer.Height + y * (fieldHeight + 3), // yPos
fieldWidth,
fieldHeight);
this.Controls.Add(field);
}
}
}
}
Вот в чем заключается моя проблема: в этих for
циклах я пытаюсь создать сетку 6x10 из Field
s (каждый из которых содержит PictureBox
размером 100x100 пикселей). Я делаю это почти успешно, так как мое второе поле отображается неправильно:
Единственное, что я обнаружил, что работает (полностью устраняет проблему), это увеличение поля (например, 150 пикселей). С другой стороны, уменьшение его (например, 50 пикселей) делает проблему еще больше:
Возможно, полезная информация и то, что я пробовал:
- Моя основная форма
AutoSize = true;
сAutoSizeMode = GrowAndShrink;
- Моя основная форма (изначально) не содержит никаких компонентов, кроме
menuStrip
иlabel
- Я попытался изменить свойство
PictureBox.Image
, но это не помогло. - Я попытался создать сетку только с
PictureBox
элементами управления (не используяField
в качестве оболочкиPictureBox
), и это действительно сработало. - Я попытался поместить
labelTimer
в эту «проблемную область», которая действительно устраняет проблему в зависимости от того, где именно я ее поместил. (поскольку позиционирование поля зависит от положения и высотыlabelTimer
) - Я попытался перезапустить визуальную студию 2017, не помогло.
Конечно, я мог бы просто изменить размер на 150 пикселей и двигаться дальше, но мне действительно любопытно узнать, в чем корень этой проблемы. Спасибо!