C# 如何从另一个未引用的项目访问GUI元素?

C# 如何从另一个未引用的项目访问GUI元素?,c#,.net,winforms,C#,.net,Winforms,简单来说,我有两个项目: 项目A:windows窗体应用程序 项目B:C#类图书馆项目 B在A上被引用,因此A不能在B上被引用。 B得到了整个程序的主要业务,我需要在GUI(项目A)上显示一些信息(反馈、警告、错误…) 每次都将信息从项目B发送回项目A以显示它,这是非常烦人的 有什么想法吗?类库应该通知UI项目它可以响应的更改,并绘制正确的UI 从UI层传递给项目B(回调)的方法到UI层可以订阅的事件,有许多方法的调用 下面是一个事件示例。有关引发自定义事件的详细信息,请参阅 publi

简单来说,我有两个项目:

  • 项目A:windows窗体应用程序

  • 项目B:C#类图书馆项目

B在A上被引用,因此A不能在B上被引用。 B得到了整个程序的主要业务,我需要在GUI(项目A)上显示一些信息(反馈、警告、错误…)

每次都将信息从项目B发送回项目A以显示它,这是非常烦人的


有什么想法吗?

类库应该通知UI项目它可以响应的更改,并绘制正确的UI

从UI层传递给项目B(回调)的方法到UI层可以订阅的事件,有许多方法的调用

下面是一个事件示例。有关引发自定义事件的详细信息,请参阅

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var projectB = new ProjectB();
            projectB.OnUpdateStatus += projectB_OnUpdateStatus;
            projectB.Run();
        }

        private void projectB_OnUpdateStatus(string message)
        {
            MessageBox.Show(message);
        }
    }



public class ProjectB
{
    public delegate void StatusUpdateHandler(string message);
    public event StatusUpdateHandler OnUpdateStatus;

    public void Run()
    {
        OnUpdateStatus("Updated");
    }
}
从您的介绍中,您提到了业务中有大量的方法,并且需要在业务方法尚未完成处理时在GUI上显示一些信息

这一切都是关于线程的。对于我上面给出的示例,它可以工作,但是UI可能不会更新,因为currect线程太忙了。当后台任务发生时,UI甚至可能会锁定

如果您只使用多线程和上面的aprach,您将发现无法在另一个线程上更新UI的问题

通过在第二个线程上执行工作来解决此问题,但事件会发回主UI线程。这将保持UI响应和更新

 public partial class Form1 : Form
    {
        private BackgroundWorker _backgroundfWorker;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _backgroundfWorker = new BackgroundWorker();
            _backgroundfWorker.ProgressChanged += OnUpdateStatus;
            _backgroundfWorker.DoWork += backgroundWorker1_DoWork;
            _backgroundfWorker.WorkerReportsProgress = true;
            _backgroundfWorker.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            var b = new ProjectB();
            b.OnUpdateStatus += ProjectBOnUpdateStatus;
            b.Run();
        }

        private void ProjectBOnUpdateStatus(string message)
        {
            _backgroundfWorker.ReportProgress(0, message);
        }

        private void OnUpdateStatus(object sender,ProgressChangedEventArgs progressChangedEventArgs)
        {
            MessageBox.Show(progressChangedEventArgs.UserState.ToString());
        }
    }

类库应该通知UI项目它可以响应的更改,并绘制正确的UI

从UI层传递给项目B(回调)的方法到UI层可以订阅的事件,有许多方法的调用

下面是一个事件示例。有关引发自定义事件的详细信息,请参阅

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var projectB = new ProjectB();
            projectB.OnUpdateStatus += projectB_OnUpdateStatus;
            projectB.Run();
        }

        private void projectB_OnUpdateStatus(string message)
        {
            MessageBox.Show(message);
        }
    }



public class ProjectB
{
    public delegate void StatusUpdateHandler(string message);
    public event StatusUpdateHandler OnUpdateStatus;

    public void Run()
    {
        OnUpdateStatus("Updated");
    }
}
从您的介绍中,您提到了业务中有大量的方法,并且需要在业务方法尚未完成处理时在GUI上显示一些信息

这一切都是关于线程的。对于我上面给出的示例,它可以工作,但是UI可能不会更新,因为currect线程太忙了。当后台任务发生时,UI甚至可能会锁定

如果您只使用多线程和上面的aprach,您将发现无法在另一个线程上更新UI的问题

通过在第二个线程上执行工作来解决此问题,但事件会发回主UI线程。这将保持UI响应和更新

 public partial class Form1 : Form
    {
        private BackgroundWorker _backgroundfWorker;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _backgroundfWorker = new BackgroundWorker();
            _backgroundfWorker.ProgressChanged += OnUpdateStatus;
            _backgroundfWorker.DoWork += backgroundWorker1_DoWork;
            _backgroundfWorker.WorkerReportsProgress = true;
            _backgroundfWorker.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            var b = new ProjectB();
            b.OnUpdateStatus += ProjectBOnUpdateStatus;
            b.Run();
        }

        private void ProjectBOnUpdateStatus(string message)
        {
            _backgroundfWorker.ReportProgress(0, message);
        }

        private void OnUpdateStatus(object sender,ProgressChangedEventArgs progressChangedEventArgs)
        {
            MessageBox.Show(progressChangedEventArgs.UserState.ToString());
        }
    }

类库不应引用包含用户控件和窗体的程序集。应该是相反的。WinForms中控件和库之间的消息传递通常使用事件或命令进行。您绝对不应该在类库中使用类似
form1.ErrorMessage=“发生了不好的事情”
的代码


我在业务中有大量的方法,当业务方法尚未完成处理时,我需要在GUI上显示一些信息


然后在类库中创建一个
ReportProgress
事件或任何事件,并从GUI订阅该事件以显示进度。

类库不应引用包含用户控件和表单的程序集。应该是相反的。WinForms中控件和库之间的消息传递通常使用事件或命令进行。您绝对不应该在类库中使用类似
form1.ErrorMessage=“发生了不好的事情”
的代码


我在业务中有大量的方法,当业务方法尚未完成处理时,我需要在GUI上显示一些信息


然后在类库中创建一个
ReportProgress
事件或任何事件,并从GUI订阅该事件以显示进度。

将信息从项目B发送回项目a是非常烦人的。您能否通过附上a来说明这一点?项目B的班级在做什么?这就是常见控件保存在DLL中并在另一个项目的GUI上动态加载的方式。也许你在尝试这种时尚?这就是它的工作原理。通常您至少有3个项目,1:UILogic,2:BusinessLogic,3:应用程序,您将数据从BusinessLogic发送到UILogic,然后由应用程序显示…每次将信息从项目B发送回项目A以显示它时都非常烦人-这就是UI和业务逻辑的工作方式-检查:我在业务中有大量的方法,当业务方法尚未完成处理时,我需要在GUI上显示一些信息,然后你应该重新设计你的方法-如果不这样做,你会陷入一片混乱。你现在的问题是一个关于它的标志,这是非常烦人的,从项目B发回信息到项目a,你能用附件a来说明这一点吗?项目B的班级在做什么?这就是常见控件保存在DLL中并在另一个项目的GUI上动态加载的方式。也许你在尝试这种时尚?这就是它的工作原理。通常您至少有3个项目,1:UILogic,2:BusinessLogic,3:应用程序,您将数据从BusinessLogic发送到UILogic,然后由应用程序显示…每次将信息从项目B发送回项目A以显示它时都非常烦人-这就是UI和业务逻辑的工作方式-检查:我在业务中有大量的方法,当业务方法尚未完成处理时,我需要在GUI上显示一些信息,然后你应该重新设计你的方法-如果不这样做,你会陷入一片混乱。你现在的问题是关于IT的一个信号项目a与B有关,tha