【发布时间】:2013-03-01 16:01:13
【问题描述】:
我正在尝试为 PC 制作流行游戏“Ruzzle”请参阅:
我认为我遇到了一个非常愚蠢的错误,但由于某种原因,它看起来像一个属性不起作用!
我有一个名为“check”的类,它有一个名为 Used 的 bool 属性。如果设置为 true,背景将从白色变为橙色。这是通过以下方式实现的:
bool _used;
public bool Used
{
get { return _used; }
set { _used = value; Invalidate(); }
}
void Check_Paint(object sender, PaintEventArgs e)
{
Graphics area = e.Graphics;
if (_used==false)
{
area.FillRectangle(Brushes.White, 0, 0, Width - 1, Height - 1);
...
}
else
{
area.FillRectangle(Brushes.Orange, 0, 0, Width - 1, Height - 1);
...
}
}
我已经为mouseClick 分配了一个我将在Ruzzle 类中定义的事件。
Ruzzle 类处理游戏,基本上是Check 的二维数组。
public event EventHandler selected;
//in the constructor I've put this
this.MouseClick += new MouseEventHandler(Check_MouseClick);
最后
void Check_MouseClick(object sender, MouseEventArgs e)
{
if (selected != null)
{
selected(this, e);
}
Invalidate();
}
在 Ruzzle 类中,我尝试通过以下方式更改 Check 对象的 bool 属性:
public Ruzzle(Control father)
{
myGame = new Check[4, 4];
for (int i = 0; i < 4; i++)
{
for(int j=0;j<4;j++)
{
myGame[i, j] = new Check(50, father,i,j);
myGame[i, j].Location = new Point((i * 50), (j * 50));
father.Controls.Add(myGame[i, j]);
myGame[i, j].selected += new EventHandler(Ruzzle_selected);
}
}
}
void Ruzzle_selected(object sender, EventArgs e)
{
int r = (sender as Check).Row;
int c = (sender as Check).Column;
myGame[r, c].Used = true;
}
Row 和 Column 属性工作正常,因为如果我执行 MessageBox.Show 我会得到正确的值。 但是,当它在 Check 类中执行 Paint 方法时,Used 布尔值不会改变!
我做错了什么?
【问题讨论】:
-
虽然它可能无法解决您的问题,但请删除
myGame[r, c].Invalidate();。不需要,因为设置Used已经调用了Invalidate()。 -
你有没有调试过它以查明使用的属性设置器是否真的被调用了?
-
由于某种原因,在它执行“myGame[r,c].Used = true”指令后,它直接进入Paint方法..所以不,它没有被调用.Wierd。你认为问题是什么?
-
非常感谢!
-
你是如何确定值没有改变的?
标签: c# winforms properties boolean