【问题标题】:C# Form , Properties not working?C# 窗体,属性不起作用?
【发布时间】: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;
}

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

我做错了什么?

【问题讨论】:

  • 虽然它可能无法解决您的问题,但请删除myGame[r, c].Invalidate();。不需要,因为设置 Used 已经调用了 Invalidate()
  • 你有没有调试过它以查明使用的属性设置器是否真的被调用了?
  • 由于某种原因,在它执行“myGame[r,c].Used = true”指令后,它直接进入Paint方法..所以不,它没有被调用.Wierd。你认为问题是什么?
  • 非常感谢!
  • 你是如何确定值没有改变的?

标签: c# winforms properties boolean


【解决方案1】:

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

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

  1. 未正确更改为 true

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

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

  1. 仅实例化一个实例。在这种情况下,您应该在游戏中创建一个 1x1 字段。

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

好的,现在您正在调试Check 类的唯一实例。让我们从检查属性是否设置正确开始。有几个地方你应该检查你的财产价值,例如:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多