gpt4 book ai didi

C# 窗体,属性不起作用?

转载 作者:太空宇宙 更新时间:2023-11-03 13:45:49 24 4
gpt4 key购买 nike

我正在尝试为 PC 制作流行的游戏“Ruzzle”请参阅:

enter image description here

我被困在一个我认为非常愚蠢的错误上,但出于某种原因,它看起来像一个属性不起作用!

我有一个名为“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;
}

RowColumn 属性工作正常,因为如果我执行 MessageBox.Show,我会得到正确的值。 然而,当它在 Check 类中执行 Paint 方法时,Used boolean 值不会改变!

我做错了什么?

最佳答案

我会将此作为答案发布,但此答案不会告诉您代码的确切问题是什么。代码本身看起来不错,因此您必须对其进行调试。让我给你一些关于如何调试这个问题的提示。

我可以看到两种明显的可能情况,为什么您的 Used 属性为 false:

  1. 它没有被正确地更改为 true

  2. 它在某个时候重置回 false

所以你必须检查这两种可能性。首先,我们应该忽略所有 Check 实例,除了被点击的实例,否则其他实例可能会在调试时分散您的注意力。有两种简单的方法可以做到这一点:

  1. 只实例化一个实例。在这种情况下,如果您的游戏可能的话,您应该创建一个 1x1 字段。

  2. 调试时区分距离。 VS 调试器中有一个很好的功能叫做 Make object Id .基本上,它允许您在调试时为某个对象分配一个数字唯一标识符。稍后您可以通过在调试器中观察其 Id 来确定特定实例是否是您之前标记的实例。如果您以前没有使用过此功能,请查看上面的链接。

好的,现在您只调试了 Check 类的实例。让我们从检查属性设置是否正确开始。有几点您应该检查您的属性值,例如:

  1. Paint 您有条件的处理程序。

  2. 调用 Invalidate 方法时 Used 属性的 Setter。 _used 应该绝对是 true

  3. Ruzzle_selected 处理程序的末尾。 Used 属性在这里应该是 true,您应该检查它。如果它是 true,那么我们可以得出结论,至少它设置正确。

现在让我们检查属性 Used 是否未重置回 false。据我在您的代码中看到的,您应该没有任何地方可能真正想要重置它。这意味着如果您会发现这样的行为,那么它可能就是您正在寻找的错误。我假设您不会在除 Used 属性之外的任何地方访问您的 _used 字段。在这种情况下,调试这个可能的问题非常容易,您只需在属性的 setter 中放置一个断点,然后查看它是否设置为 false。为了避免在将其设置为 true 时遇到断点,您可以使用 breakpoint condition特征。在您的情况下,条件应该类似于 value == false && _used == true

请尝试使用这些步骤进行调试,如果对您有帮助,请告诉我们。否则它可能是我遗漏的东西,在这种情况下我会扩展答案。

关于C# 窗体,属性不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com