【问题标题】:How to pass custom EventArgs to UI controls如何将自定义 EventArgs 传递给 UI 控件
【发布时间】:2018-07-18 03:10:43
【问题描述】:

很遗憾,我无法找到问题的相关答案。我有一个具有事件“VideoEncoding”的对象编码器。它传递自定义 EncodingEventArgs,其中包括进度、大小等各种属性。我可以将此信息输出到控制台或写入文本文件。但是当我尝试在 WinForms 中使用它时,我无法将该信息传递给 UI,如标签或进度条。我尝试了不同的方法。后台工作人员似乎是个好主意,问题是后台工作人员无法订阅 VideoEncoding 事件,它也不会接受我的自定义 EventArgs。这是我能够放在一起的。也许有一种不同的方法可以使用与 UI 通信的委托来实现。欢迎任何建议。谢谢。

public partial class Form1 : Form
{


    private BackgroundWorker bw;
    int _progress;

    public Form1()
    {
        InitializeComponent();

        this.bw = new BackgroundWorker();
        this.bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        this.bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);        
        this.bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        this.bw.WorkerReportsProgress = true;

        this.button1.Click += new EventHandler(button1_Click);
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.label1.Text = "The job is: " + e.Result.ToString();
        this.button1.Enabled = true;
    }

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.label2.Text = e.ProgressPercentage.ToString() + "% complete";

    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker)sender;


        this.Encode

        worker.ReportProgress(_progress);


        e.Result = "Completed";
    }


    private void button1_Click(object sender, EventArgs e)
    {


        if (!this.bw.IsBusy)
        {
            this.bw.RunWorkerAsync();
            this.button1.Enabled = false;
        }
    }





    public void Encode()
    {

        var job = new EncodingJob();
        //setup encoding job

        //subscribe to an event
        ffmpeg.VideoEncoding += GetProgress;           

        ffmpeg.DoWork(job);

    }



    public void GetProgress(object sender, EncodingEventArgs e)
    {
        _progress = (int)e.Progress;


    }


  }

【问题讨论】:

  • 这里有什么问题?代码有效吗?
  • 可以开始编码工作,但看不到进度。编码作业面临不同的威胁,其进度无法直接传递给 UI。这就是为什么我们需要后台工作者或其他委托以某种方式将该信息传递给 UI。回答你的问题,编码是,看到进度没有。

标签: c# winforms delegates


【解决方案1】:

尝试在GetProgress 方法中调用后台工作人员ReportProgress。如果您不发出信号,表格应该如何知道您的进度?

【讨论】:

  • 谢谢。事后我意识到我需要引发 ReportProgress 事件,但不是针对工作对象,而是针对 GetProgress 方法中的 bw 对象。一切都很完美。
猜你喜欢
  • 2017-08-16
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多