Esta es la función dentro de la ventana a la que intento acceder

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();
}

Esta es la función que está fuera de la ventana principal tratando de acceder a ella

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

Este código estaba funcionando antes de agregar otro formulario que hice un formulario de inicio. Entonces, cuando el formulario MainWindow ya no es el formulario de inicio, aparece un error "System.NullReferenceException: 'La referencia de objeto no se establece en una instancia de un objeto'", lo que supongo que se debe a que ahora está intentando acceder al formulario de inicio. aunque este código solo se ejecuta cuando el formulario MainWindow es el único abierto, por lo que no estoy seguro de qué hacer para editarlo.

Sé que puedo usar MVVM aunque para este proyecto no puedo usar MVVM porque es demasiado tarde. Entonces no puedo usar MVVM.

0
sbondo1234 18 oct. 2019 a las 19:33

1 respuesta

La mejor respuesta

En su clase MainWindow, agregue lo siguiente:

public static MainWindow Instance;

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

Cambie su método static "externo" a:

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
        }
    }));
}

Y cambia tu método "interior" a:

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

Observe que eliminé la creación de un nuevo hilo, porque todo lo que estaba haciendo era crear un nuevo hilo para llamar inmediatamente al hilo de la interfaz de usuario nuevamente, lo cual no tiene sentido.
Para la versión static, a menos que planee llamarlo desde otro hilo, puede eliminar Dispatcher.Invoke. Lo dejé por si acaso.

0
Keith Stein 18 oct. 2019 a las 18:02