簡體   English   中英

如何在 WPF 表格外部調用 function

[英]How to call a function inside a WPF form outside of it

這是我正在嘗試訪問的 window 內部的 function

public void LogConsole(string message, string type = "Default")
{
    Thread LogConsoleThread = new Thread(() =>
    {
        Application.Current.Dispatcher.Invoke(new Action(() =>
        {
            ConsoleLogBox.Text += $"{Environment.NewLine}[{DateTime.Now.ToString("h:mm:ss tt")}] {message}";
        }));

    });
    LogConsoleThread.Start();

    ConsoleLogBox.ScrollToEnd();
}

這是 function 試圖訪問它的主窗口之外

public static void LogConsole(string message, string type = "Default")
{
    Application.Current.Dispatcher.Invoke(new Action(() =>
    {
        ((MainWindow)Application.Current.MainWindow).LogConsole(message, type);
    }));
}

在我添加另一個我制作啟動表單的表單之前,此代碼正在運行。 因此,當 MainWindow 表單不再是啟動表單時,我收到錯誤“System.NullReferenceException:'對象引用未設置為 object 的實例。'”我假設是因為它現在正在嘗試訪問啟動表單盡管此代碼僅在 MainWindow 窗體是唯一打開的窗體時才運行,所以我不確定如何編輯它。

我知道我可以使用 MVVM,盡管對於這個項目我不能使用 MVVM,因為為時已晚。 所以我不能使用 MVVM。

在您的MainWindow class 中,添加以下內容:

public static MainWindow Instance;

public MainWindow()
{
    InitializeComponent();
    Instance = this;
}

將您的static “外部”方法更改為:

public static void LogConsole(string message, string type = "Default")
{
    Application.Current.Dispatcher.Invoke(new Action(() =>
    {

        if (MainWindow.Instance != null)
        {
            (MainWindow.Instance.LogConsole(message, type)
        }
        else
        {
            //Do something if MainWindow isn't loaded yet
        }
    }));
}

並將您的“內部”方法更改為:

public void LogConsole(string message, string type = "Default")
{            
    ConsoleLogBox.Text += $"{Environment.NewLine}[{DateTime.Now.ToString("h:mm:ss tt")}] {message}";
    ConsoleLogBox.ScrollToEnd();
}

請注意,我已經刪除了新線程的創建,因為您所做的只是創建一個新線程以立即再次調用 UI 線程,這是沒有意義的。
對於static版本,除非您打算從另一個線程調用它,否則您可以刪除Dispatcher.Invoke 我把它留了以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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