Showing a topmost WPF window from a background service
- xTr1m
- 0
- Posted on
I’m writing a plugin in .NET that’s hosted on a windows service running in the background. There I want to display a WPF modal window that should be activated and stay on top as soon as it gets shown. This is the only way I found that worked for me:
using System;
using System.Threading;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Interop;
using System.Windows.Threading;
public static class UiHelper
{
public static void ShowDialogInNewThread<T>(object dataContext, Action<T> onComplete) where T : Window, new()
{
Thread thread = new Thread(() =>
{
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
var window = new T();
window.DataContext = dataContext;
window.Closed += (s, e) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
window.Show();
IntPtr handle = new WindowInteropHelper(window).Handle;
AutomationElement element = AutomationElement.FromHandle(handle);
if (element != null)
{
element.SetFocus();
}
System.Windows.Threading.Dispatcher.Run();
onComplete(window);
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
thread.Join();
}
}