C # доступ к члену формы из отдельного класса - PullRequest
0 голосов
/ 06 сентября 2010

Мне нужен совет, пожалуйста, о лучшем способе достижения определенного результата ...

Мой сценарий ...

У меня есть класс Form1, который является моей основной формой с картинкой.

У меня есть второй класс, называемый камерой, который с помощью обработчика событий получает кадр (растровое изображение) с моей веб-камеры.

Затем я хочу передать этот кадр в графическую рамку в главной форме наилучшим образом.

На данный момент в основной форме у меня есть код:

public static void setPB(Bitmap image) 
{

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

}

тогда в классе Camera я использую

Form1.setPB (currentFrame);

Это прекрасно работает, однако я не был уверен, что это лучшая практика программирования? Можно ли использовать пользовательские события?

Заранее спасибо за любую помощь

Tom

Ответы [ 5 ]

0 голосов
/ 06 сентября 2010

что движет событием, которое заставляет класс Camera захватывать картинку? Это важно.

Вам даже не нужен установщик PictureBox в форме, если событие запускается самой формой.

Кстати, я с Хорхе Кордобой, сеттер и захват - все, что вам нужно. Оккам бритвой.

0 голосов
/ 06 сентября 2010

Определенно, события - правильный выбор. Вы можете реализовать Observer Design Pattern, используя их. Ваша текущая реализация не является лучшей практикой - она ​​обеспечивает тесную связь между классом Camera и Form.

0 голосов
/ 06 сентября 2010

Да, я бы сказал, это отлично. У вас есть класс камеры, отвечающий за обработку ввода с камеры, и общедоступный установщик для частного члена вашей формы. Я бы не стал немного меняться.

Таким образом, вы разделяете разные обязанности по функциональности на разные классы. Не обрабатывайте события камеры внутри класса Form, а делайте так, как вы делаете.

0 голосов
/ 06 сентября 2010

Я бы создал метод для класса Camera, который берет изображение и возвращает объект Bitmap.

Поэтому в OnLoad или OnClick кнопки вызовите этот метод и установите для возвращаемого значения значениеthe 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;
}
0 голосов
/ 06 сентября 2010

Я бы использовал события, если бы я был на вашем месте.

...