0

我是 C# 的一个极端新手,但我一直在慢慢地阅读 Head Start C# 教程书(到目前为止发现它非常有趣)。但是,我在第一个“实验室”任务中遇到了困难:他们提供了用于控制 PictureBox 的代码,我可以让该代码在主窗体上工作,但我不能让它在一个类中工作. 我已经复习了旧课程,并且对我所缺少的东西有了一个很好的了解,但是对于我的生活,我无法弄清楚如何从课堂上访问主窗体的图片框(正如教程告诉我应该做的那样)。

这有点令人沮丧,因为我根本没有在书中跳到前面,但我发誓我们还没有涵盖这个。无论如何,吸引真正的程序员。

这是教程中提供的代码,位于名为“您的对象可以控制表单上的内容”的部分中(对于任何有本书的人来说,p208)。

Point p = MyPictureBox.Location 
p.x += distance;
MyPictureBox.Location = p

下面我在下面发布我的代码的相关(我认为?)部分。Button1 在编译时为我工作,Button2 “工作”,因为当前类只是告诉它打印传递的 INT,因为我已经注释掉了我无法工作的代码。

提前致谢!

Form1 的代码:

//


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// Namespaces I'll need.

namespace Troubleshooting_PicBoxes
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent(); // Start all the Form1 stuff (all IDE-generated)

    }

    private void button1_Click(object sender, EventArgs e) //method from clicking the first button
    {
        int distance = 5; // Create this variable called "distance"

        Point BoxMovement = MyPictureBox.Location; //create a point called BoxMovement

        BoxMovement.X += distance; // Adjust the X of BoxMovement by my distance int.

        MyPictureBox.Location = BoxMovement; // now adjust the Box by the Point's location.

    }

    private void button2_Click(object sender, EventArgs e)
    {
        PicMover PicMoverObject1 = new PicMover(); // Reserve Space for&Create object
        PicMoverObject1.MoveThatPic(5); // Execute Object Method with a value of 5




    }


}
}

PicMover 类的代码:

//

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Troubleshooting_PicBoxes
{
class PicMover
{


    public void MoveThatPic(int distance) // New method, 
                                          // takes a variable called Distance.

    {
        MessageBox.Show(distance.ToString()); // Just show us that Variable.


        // I need to be able to access Form1's picture box before I can use this. :(
        /*           Point BoxMovement = MyPictureBox.Location; //create a point called BoxMovement
                    BoxMovement.X += distance; // Adjust the X of that by distance.
                    MyPictureBox.Location = BoxMovement; // now adjust the Box by the Point's location.
        */


    }
}

}

4

3 回答 3

1

如果您需要访问某些内容,为什么不直接授予它访问权限?就像将它作为参数传递给方法一样。

public void MoveThatPic(PictureBox picBox, int distance) // New method, 
                                      // takes a variable called Distance.

{
    MessageBox.Show(distance.ToString()); // Just show us that Variable.


    // I need to be able to access Form1's picture box before I can use this. :(
    Point BoxMovement = picBox.Location; //create a point called BoxMovement
    BoxMovement.X += distance; // Adjust the X of that by distance.
    picBox.Location = BoxMovement; // now adjust the Box by the Point's location.
}

现在在 button2 click 事件处理程序中:

private void button2_Click(object sender, EventArgs e)
{
    PicMover PicMoverObject1 = new PicMover(); // Reserve Space for&Create object
    PicMoverObject1.MoveThatPic(MyPictureBox, 5); // Execute Object Method with a value of 5
}
于 2009-12-22T01:55:12.300 回答
0

教程代码看起来就像您从班级 (MyPictureBox.Location) 中获取位置,然后更改位置,然后将对象移动到该新位置。

Point p = MyPictureBox.Location // Save the location of your object
p.x += distance; // Increase the distance
MyPictureBox.Location = p // Set your object to the new location

第二个按钮按下事件不同。也许您应该从该函数返回一个位置?因此,当您调用该函数时,您将主窗体上的 PictureBox 设置为返回的值。

于 2009-12-22T02:13:10.547 回答
0

如果您想创建一个可以从任何 Form 访问的通用类……创建它的实例……以移动该 F 表单上的任何 PictureBox,那么'Deerchao's answer向您展示了如何做到这一点。

虽然......考虑......每个 Form 都将声明自己的 PicMover 实例;Form1 的 PicMover 实例对任何其他 Form 都不“可见”,除非您也以某种方式发布它。

更专业地说:PicMover 类,如这里定义的,存在于 Application NameSpace 的 Scope 中;它是一个模板,用于创建应用程序中的每个其他类都可以用来创建其实例的对象类型,但应用程序中的任何类都没有“具有”默认情况下的实例。

这是 Deerchao 演示“注入”的出色答案的替代方法:当您希望类的实例“保留”引用时,注入是合适的:在此示例中,我们说 PictureBox 的 Form 实例被“绑定”到'PicMover 类的实例:

我们在类 'PicMover 中声明一个公共属性,它将持有对 Form1 的 PictureBox 的引用:

public class picMover
{
    // note use of C# 3.0 automatic property feature here
    public PictureBox myPictureBox { get; set; }

    public void movePic(int distance)
    {
        // note test for null here
        if (myPictureBox != null)
        {
            myPictureBox.Left += distance;
        }
    }
}

所以在 Form1 中创建 'PicMover 的实例后,设置其内部的 PictureBox 属性,然后使用其内部的 'movePic 方法:像这样:

// instance of PicMover created in the Form's scope
picMover myPicMover = new picMover();

private void Form1_Load(object sender, EventArgs e)
{
    // when the Form loads inject the reference to the PictureBox instance into the instance of 'PicMover
    myPicMover.myPictureBox = pictureBox1;
}

private void button1_Click(object sender, EventArgs e)
{
    myPicMover.movePic(23);
}

请注意,恕我直言,测试以确保存在对对象的“注入”引用,通过在使用之前测试 null 是一个好习惯。

您可以将 PictureBox 对象的实例“绑定”到 'PicMover 的实例中的另一种方法是将 PictureBox 的实例作为参数传递给类的构造函数:我敢打赌,当我完成发布此内容时,其他人将已经发布了一个显示该技术的答案。当您希望更改内部引用与将 PictureBox 传递给类的构造函数时,您可能希望使用此处所示的公共属性“注入”您不希望更改它。

另一种策略是使 'PicMover 成为一个公共静态类,使用公共静态方法:然后每个表单都可以“看到它”,并且不需要任何表单来创建它的实例(实际上你不能“实例化”一个如果您愿意,可以使用静态类:这就是静态类)。

于 2009-12-22T02:51:53.527 回答