C# 仅显示信息/更新主gui的最佳方式
首先,这可能是一个愚蠢的问题,但无论如何,这不是一个问题,基本上我正在寻找一种最好的方式,将一个类的结果显示到主窗口。 现在我会告诉你我需要什么,然后我会如何用我现有的知识解决这个问题,知道这是不正确的方式C# 仅显示信息/更新主gui的最佳方式,c#,class,main,solid-principles,C#,Class,Main,Solid Principles,首先,这可能是一个愚蠢的问题,但无论如何,这不是一个问题,基本上我正在寻找一种最好的方式,将一个类的结果显示到主窗口。 现在我会告诉你我需要什么,然后我会如何用我现有的知识解决这个问题,知道这是不正确的方式 因此,单击按钮,我可以执行以下操作: private void btnSend_Click(object sender, RoutedEventArgs e) { new Notification().DoNotify(txtMessage.Tex
因此,单击按钮,我可以执行以下操作:
private void btnSend_Click(object sender, RoutedEventArgs e)
{
new Notification().DoNotify(txtMessage.Text);
}
类别定义如下:
public class Notification
{
private IMessenger _iMessenger;
public Notification()
{
_iMessenger = new Email();
}
public void DoNotify(string Message)
{
_iMessenger.SendMessage(Message);
}
}
interface IMessenger
{
void SendMessage(string Message);
}
public class SMS : IMessenger
{
public void SendMessage(string Message)
{
// i want code that will print this message variable to the txtSMS textbox.
}
}
public class Email : IMessenger
{
public void SendMessage(string Message)
{
// i want code that will print this message variable to the txtEmail textbox.
}
}
现在,如何从这些类更新主窗口GUI
我会使用的一个解决方案是,添加新的tempclass,其中包含mainwindow对象,然后访问它
public class TempClass
{
public static MainWindow Main;
}
在主窗口构造函数中:
public MainWindow()
{
InitializeComponent();
TempClass.Main = this;
}
以及sms/电子邮件类:
public class Email : IMessenger
{
public void SendMessage(string Message)
{
TempClass.Main.txtEmail.Text = Message;
}
}
public class SMS : IMessenger
{
public void SendMessage(string Message)
{
TempClass.Main.txtSMS.Text = Message;
}
}
现在这是可行的,但必须有更好的方法。。。你觉得怎么样?很抱歉发了这么长的帖子…://
这方面有什么原则或设计模式吗?当您可能有两个或多个应用程序实例时,不建议使用静态属性。您可以在主窗口中定义一个方法:
internal void SetMessage(string Message)
{
Dispatcher.BeginInvoke(new Action(() => {txtSMS.Text = Message;}));
}
并将MainWindow的实例发送到其他类,无论是通过特定的构造函数
MainWindow parentWindow;
void btnSend_Click(object sender, RoutedEventArgs e)
{
if (parentWindow != null)
_parentWindow.SetMessage(txtMessage.Text);
}
或者通过定义DependencyProperty并使用绑定
您也可以使用事件,但是,我更喜欢前面的方法。我同意,我实际上在这类情况下使用了事件,但我忘了提到,好的,还有比事件更好的方法吗?不需要事件和由此产生的强绑定-Windows窗体和WPF都提供数据绑定。通过实现INotifyPropertyChanged接口,您可以通知订阅者(UI)发生了更改,但不需要为每种数据使用单独的事件。数据绑定机制将负责刷新UI@ShadyOverflowWPF还是Winforms?WPF有多个MVVM框架,它们已经实现了您所需要的功能。有些,如Caliburn.Micro,甚至使用约定自动将
消息
列表框绑定到ViewModelPanagiotis上的消息
列表属性:对于您的需求,数据绑定甚至比事件更合适。