[英]How to call a function inside a scriptcontrol from outside using javascript
[英]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.