上下文:我正在尝试在Windows.Forms中制作一个西洋双陆棋的小游戏。我有3个类GameBoard.cs,Points.cs和Checkers.cs(以及Form1.cs)。我需要做的是使用其他一些类来更改PictureBox的某些属性的值。

具体来说,我有此代码:

// gameBoard.cs

namespace backgammon
{
    public class gameBoard
    {

        Checker checker1;
        Points point1;
        Points[] pointsArray;

        public gameBoard()
        {
             // make new checker (ID, PictureBox, startingPoint)
             checker1 = new Checker(1, checkerPicBox1, 1);

             // make new Point (ID, arrayOfCheckers)
             point13 = new Points(1, new Checker[]{checker1 /*,checker2... etc*/});

             pointsArray = new Points[MAX_POINTS];
             pointsArray[0] = point1;
        }
    }
}


所以这就是我“设置”检查器和要点的方式。我的检查器和点类可以获取并设置传递给其构造的所有变量。

问题:我要实现的目的是在单击检查器时使其“突出显示”。

在Form1中:

// Form1.cs

private void checkerPicBox1_Click(object sender, EventArgs e)
{
    int pointNumber = gameBoard.checker1.getPointMember();

    // find the top most checker in the checker array so we can highlight it
    Checker topMost = gameBoard.pointsArray[pointNumber - 1].getCheckerFromIndex(gameBoard.pointsArray[pointNumber - 1].getCheckerArray().Length - 1);

    // get the picturebox and change the image
    topMost.getPictureBox().BackgroundImage = global::Backgammon.Properties.Resources.blackCheckerSelected;
}


代码可以编译并运行,但是当它到达checkerPicBox_Click的最后一行时,似乎什么都没有发生(图像没有改变)。

这是怎么回事我没有我的PictureBox的正确实例吗?还是我以一种奇怪的方式/不是我应该做的方式这样做?

最佳答案

由于检查器已连接到图片框,为什么不在Checker类中为其创建新的引用属性?

您可以在构造函数中传递包含图片框的表单,并使用该表单创建对正确的图片框实例的引用。

// gameBoard.cs

namespace backgammon
{
    public class gameBoard
    {
        Checker checker1;
        Points point1;
        Points[] pointsArray;

        public gameBoard(Form gameForm)
        {
             // make new checker (ID, PictureBox, startingPoint)
             checker1 = new Checker(1, gameForm.checkerPicBox1, 1);

             // make new Point (ID, arrayOfCheckers)
             point13 = new Points(1, new Checker[]{checker1 /*,checker2... etc*/});

             pointsArray = new Points[MAX_POINTS];
             pointsArray[0] = point1;
        }
    }
}


将picturebox属性添加到您的Checker类:

// checker.cs

public class Checker
{
   PictureBox _picturebox;

   //... other code here

   public Checker(int ID, PictureBox picturebox, Points startingPoint)
   {
      _picturebox = picturebox;

      //...other code here
   }
}


然后我们可以在游戏形式中使用它:

gameBoard gameBoard1 = new gameBoard(this);
gameBoard1.checker1._picturebox.BackgroundImage = global::Backgammon.Properties.Resources.blackCheckerSelected;
gameBoard1.checker1._picturebox.Invalidate();

09-17 12:50
查看更多