【问题标题】:Pass data from class to Form through different class通过不同的类将数据从类传递到表单
【发布时间】:2013-12-08 23:25:16
【问题描述】:

有没有更好的解决方案通过不同的类将数据从一个类发送到另一个类?我在 ImageProccessing 类中有图像,我想把他送到 MainForm 类。

  • MainForm.cs (GUI)
  • VideoProccessing.cs
  • ImageProccessing.cs

我有这个伪代码:

    class MainForm : Form
    {
        VideoProccessing _video = new VideoProccessing();
    }

    class VideoProccessing
    {
        ImageProccessing _image = new ImageProccessing();
    }

    class ImageProccessing
    {
        Bitmap _bmp = null;

        public void SomeBadassProcess()
        {
            _bmp = new Bitmap();          //How to send this to MainForm (GUI)
        }
    }

我的解决方案:

    class MainForm : Form
    {
        VideoProccessing _video = new VideoProccessing();
        _video.SendAgain += (ShowImage);

        private void ShowImage(Bitmap bmp)
        {
            SomePictureBox.Image = bmp;
        }

    }

    class VideoProccessing
    {
        ImageProccessing _image = new ImageProccessing();
        _image.Send += (ReceivedImage)

        public delegate void SendAgainImage(Bitmap bmp);
        public event SendAgainImage SendAgain;

        private void ReceivedImage(Bitmap bmp)
        {
            SendAgain(bmp);
        }
    }

    class ImageProccessing
    {
        Bitmap _bmp = null;

        public delegate void SendImage(Bitmap bmp);
        public event SendImage Send;

        public void SomeBadassProcess()
        {
            _bmp = new Bitmap();          //How to send this to MainForm (GUI)

            Send(_bmp);
        }
    }

【问题讨论】:

    标签: c# pass-data


    【解决方案1】:

    如果您的VideoProcessing 类依赖于ImageProcessing 类,但是,您只希望让您的MainForm 知道VideoProcessing,那么以您的方式传播您的消息可能是可以接受的。但是,它确实在您的对象之间创建了强耦合,您在这个阶段可能会或可能不会关心。

    另一种方法是使用某种消息总线,例如EventAggregatorMediator。这两种行为模式都旨在解耦消息传递过程中涉及的对象并提供publish/subscribe 机制。

    例如,如果您要实现 EventAggregator,您的 MainForm 将是 subscriber,监听从 publisher 发送的通知,在您的场景中是 ImageProcessing 类。

    一个人为的代码示例可能如下所示:

    public class MainForm : Form
    {
        private readonly EventAggregator eventAggregator;
        private readonly VideoProcessing videoProcessing;
    
        public MainForm()
        {
            this.eventAggregator = new EventAggregator();
            this.eventAggregator.Subscribe<NewBitmapEvent>(HandleNewBitMap);
            this.videoProcessing = new VideoProcessing(this.eventAggregator);
        }
    
        private void HandleNewBitmap(Bitmap args)
        {
            // Do something
        }
    }
    
    public class VideoProcessing
    {
        private readonly EventAggregator eventAggregator;
    
        private readonly ImageProcessing imageProcessing;
    
        public VideoProcessing(EventAggregator eventAggregator)
        {
            this.eventAggregator = eventAggregator;
            this.imageProcessing = new ImageProcessing(this.eventAggregator);
        }
    }
    
    
    public class ImageProcessing
    {
        private readonly EventAggregator eventAggregator;
    
        public ImageProcessing(EventAggregator eventAggregator)
        {
            this.eventAggregator = eventAggregator;
            this.eventAggregator.Publish<NewBitmapEvent>(new Bitmap(...));
        }
    }
    

    ImageProcessingpublishes 一个NewBitmapEvent 时,只有MainForm 被通知为只有它,而不是VideoProcessing 类是subscribed 事件。显然,如果订阅了其他类,那么他们也会在事件为 published 时收到通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多