user21311740
user21311740

Reputation: 13

How to access XamlRoot from a non-UI thread?

I am making a WASDK WinUI 3 app. In my App.xaml.cs, I have this:

public static XamlRoot AppXamlRoot { get; set; }

Then, on my main window, I've got this:

private void MainGrid_Loaded(object sender, RoutedEventArgs e)
{
    App.AppXamlRoot = this.Content.XamlRoot;
}

MainGrid is a Grid element in the XAML code. Finally, on a ViewModel class, I have an async method that uses the App.AppXamlRoot, which should be accessible because it is static and App class declaration is accessible from the whole C# project. In my async method, the App.AppXamlRoot throws a COM exception.

await MyMessageBox.Show($"{ex.Message}\n\n{ex.InnerException}", App.AppXamlRoot);

Upvotes: 0

Views: 218

Answers (1)

Andrew KeepCoding
Andrew KeepCoding

Reputation: 13666

If you need to access the UI from a non-UI thread, you need to use the DispatcherQueue.

For example, in your App.xaml.cs:

public static DispatcherQueue DispatcherQueue { get; } = DispatcherQueue.GetForCurrentThread();

and use it like this:

App.DispatcherQueue.TryEnqueue(async () =>
{
    // Acceess the UI here...
}

Upvotes: 0

Related Questions