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#类图书馆项目
有什么想法吗?类库应该通知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