簡體   English   中英

通過靜態幫助器類從另一個類訪問GUI

[英]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是一種必須創建的類型,可以為它提供諸如MessageTimeWrittenSeverity等的屬性。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM