[英]Accessing GUI from another class via a static helper class
我只是想問一下下面的代碼是否是從另一個類訪問GUI的有效方法,或者這是一種不好的做法。 我要做的是將日志消息寫入Form1中的RichTextBox中。
如果不好的做法,最好將我的Form1的引用傳遞給另一個類,以便能夠訪問RichTextBox。
我有以下代碼從另一個類訪問Form1中的GUI:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Logger.Init(this.rtbLog);
MyOtherClass myOtherClass = new MyOtherClass();
myOtherClass.DoSomething();
}
}
public class MyOtherClass
{
public void DoSomething()
{
Logger.AppendText("text...");
Logger.AppendText("text...");
Logger.AppendText("text...");
}
}
public static class Logger
{
private static RichTextBox _rtb;
public static void Init(RichTextBox rtb)
{
_rtb = rtb;
}
public static void AppendText(String text)
{
_rtb.AppendText(text);
_rtb.AppendText(Environment.NewLine);
}
}
有了活動(感謝Ondrej):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Logger.EntryWritten += Logger_EntryWritten;
MyOtherClass myOtherClass = new MyOtherClass();
myOtherClass.DoSomething();
}
void Logger_EntryWritten(object sender, LogEntryEventArgs args)
{
rtbLog.AppendText(args.Message);
rtbLog.AppendText(Environment.NewLine);
}
}
public class MyOtherClass
{
public void DoSomething()
{
Logger.AppendText("text...");
Logger.AppendText("text...");
Logger.AppendText("text...");
}
}
public static class Logger
{
public static event EventHandler<LogEntryEventArgs> EntryWritten;
public static void AppendText(string text)
{
var tmp = EntryWritten;
if (tmp != null)
tmp(null, new LogEntryEventArgs(text));
}
}
public class LogEntryEventArgs : EventArgs
{
private readonly String message;
public LogEntryEventArgs(String pMessage)
{
message = pMessage;
}
public String Message
{
get { return message; }
}
}
對於一個小的一次性項目來說可能很好,但否則記錄器應該對二手平台一無所知。 那么最好使用事件。 每當有新的日志條目被編寫時,就引發一個事件,並且對記錄的條目感興趣的使用者將訂閱一個委托。
還要注意螺紋。 如果您從不同於UI的線程中記錄消息,則將導致異常,因為您將從禁止的其他線程中訪問GUI控件。
編輯:
遵循這些原則。 LogEntryEventArgs
是一種必須創建的類型,可以為它提供諸如Message
, TimeWritten
, Severity
等的屬性。
public static class Logger
{
public static event EventHandler<LogEntryEventArgs> EntryWritten;
public static void AppendText(string text)
{
var tmp = EntryWritten;
if (tmp != null)
tmp(null, new LogEntryEventArgs(text));
}
}
consumer:
Logger.EntryWritten += Logger_OnEntryWritten;
void Logger_OnEntryWritten(object sender, LogEntryEventArgs args)
{
_rtb.AppendText(args.Message);
_rtb.AppendText(Environment.NewLine);
}
另外,不要忘記在表單/調度上調用Logger_OnEntryWritten
的主體,以避免跨線程訪問異常(如果您正在考慮使用線程)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.