C#从单独的类访问表单成员

时间:2010-09-06 09:52:43

标签: c# forms class members

我需要一些建议,以获得特定结果的最佳方式......

我的情景......

我有一个Form1类,它是我的主窗体,上面有一个图片框。

我有一个名为camera的第二个类,它使用事件处理程序从我的网络摄像头抓取一个帧(位图)。

然后我想以最佳方式将此框架传递到主窗体中的图片框。

目前在主表单中我有代码:

public static void setPB(Bitmap image) 
{

var form = Form.ActiveForm as Form1;
form.pbWebCamDisplay = image;

}

然后在Camera类中我使用

Form1.setPB(设置currentFrame);

这很好用,但我不确定这是否是最好的编程习惯?是否可以使用自定义事件?

提前感谢您提供任何帮助

汤姆

5 个答案:

答案 0 :(得分:0)

如果我在你的位置,我会使用事件。

答案 1 :(得分:0)

是的,我会说非常好。您有一个负责处理摄像头输入的摄像头类和一个表格私人成员的公共设置器。我不会改变一点。

通过这种方式,您可以将功能的不同职责分为不同的类。不要处理Form类中的相机事件,而是按照您的方式进行操作。

答案 2 :(得分:0)

我会在Camera类上创建一个方法,该方法获取图片并返回一个Bitmap对象。

因此,在OnLoad或按钮的OnClick中,调用该方法并将返回值设置为PictureBox ...

var picture = new Camera().TakePicture();
myPictureBox.Image = picture;

类似的东西:)

编辑:如果Camera类是事件驱动的组件(Camera.NewFrame事件),请尝试:

(在构造函数中):

var camera = new Camera();
camera.OnNewFrame += new OnNewFrameEventHandler(MyEventHandler);

(事件处理程序)

public void MyEnventHandler(EventArgs comingFromComponent)
{
   var image = comingFromComponent.Frame; // (hopefully this is the case :))
   myPictureBox.Image = image;
}

答案 3 :(得分:0)

当然,事件是正确的选择。您可以使用它们实现Observer Design Pattern。 您当前的实现不是最佳实践 - 它强制Camera和Form类之间紧密耦合。

答案 4 :(得分:0)

是什么驱动了使Camera类抓住图片的事件? 这很重要。

如果表单本身触发了事件,您甚至不需要表单中的PictureBox setter。

顺便说一句,我和JorgeCórdoba一起,你需要一个二传手和一个抓斗事件。 奥卡姆剃刀。