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

C#从单独的类访问表单成员,c#,forms,class,members,C#,Forms,Class,Members,我需要一些建议,请在最好的方式来实现一个特定的结果 我的剧本 我有一个Form1类,这是我的主要表格,上面有一个图片框 我有一个叫做camera的第二个类,它使用事件处理程序从我的网络摄像头抓取一帧(位图) 然后我想以最好的方式将这个框架以主形式传递给图片框 目前,在主要表格中,我有以下代码: public static void setPB(Bitmap image) { var form = Form.ActiveForm as Form1; form.pbWebCamDisplay =

我需要一些建议,请在最好的方式来实现一个特定的结果

我的剧本

我有一个Form1类,这是我的主要表格,上面有一个图片框

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

然后我想以最好的方式将这个框架以主形式传递给图片框

目前,在主要表格中,我有以下代码:

public static void setPB(Bitmap image) 
{

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

}
然后在我使用的相机课上

表1.setPB(当前帧)

这很好,但是我不确定这是否是最佳编程实践?可以使用自定义事件吗

提前谢谢你的帮助


汤姆

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

是的,我会说它非常好。您有一个camera类,负责处理camera输入,还有一个用于表单的私有成员的公共setter。我一点也不会改变


这样,您就可以将功能的不同职责划分为不同的类。不要在Form类中处理camera事件,而是按您正在做的操作。

我将在camera类上创建一个方法,该方法拍摄照片并返回位图对象

因此,在OnLoad或单击按钮时,调用该方法并将返回值设置为PictureBox

var picture = new Camera().TakePicture();
myPictureBox.Image = picture;
大概是这样:)

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

(在施工图中):

(事件处理程序)


当然,活动是正确的选择。您可以使用它们实现观察者设计模式。
您当前的实现不是最佳实践-它强制Camera和Form类之间紧密耦合。

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

如果事件是由表单本身触发的,则表单中甚至不需要PictureBox setter

顺便说一句,我和豪尔赫·科尔多瓦在一起,二传手和抢球是你所需要的。
Occam razor.

您能否为我指出正确的方向,告诉我如何实现这一点?谢谢。。我使用的是一个Forge framework(aforgenet.com),它有自己的自定义事件处理程序,可以捕获帧。感谢您的回复,不幸的是,我需要图片框来显示实时流。我最初在主窗体中使用计时器来获取图像,但是,计时器和新帧事件处理程序不同步,因此很难正确处理位图。在这种情况下,您不能从窗体中订阅事件吗?我会更新我的答案…那将是理想的,我不知道这个功能。您能给我一些示例代码吗?谢谢-我将尝试实现它,并让您知道-您使用的是来自AForge.NET框架的什么(camera)类?我会看一看,看看我在这里说的是正确的…嗨,请你能详细说明,如果你有任何链接,这将是伟大的。感谢您的帮助Microsoft使用事件模式调用Observer,很高兴知道。
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;
}