using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Threading; namespace Login_WPF.Animations.Loading { /// /// Interaction logic for Test.xaml /// public partial class Test : Window { public Test() { InitializeComponent(); } public class Window1Handler { private Thread StatusThread = null; private Window1 Popup = null; private AutoResetEvent PopupStarted = null; public void Start() { //create the thread with its ThreadStart method this.StatusThread = new Thread(() => { try { this.Popup = new Window1(); this.Popup.Show(); this.Popup.Closed += (lsender, le) => { //when the window closes, close the thread invoking the shutdown of the dispatcher this.Popup.Dispatcher.InvokeShutdown(); this.Popup = null; this.StatusThread = null; this.PopupStarted.Dispose(); this.PopupStarted = null; }; //now we can let the main thread go ahead setting the AutoResetEvent this.PopupStarted.Set(); //this call is needed so the thread remains open until the dispatcher is closed System.Windows.Threading.Dispatcher.Run(); } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }); //run the thread in STA mode to make it work correctly this.StatusThread.SetApartmentState(ApartmentState.STA); this.StatusThread.Priority = ThreadPriority.Normal; this.StatusThread.Start(); //create a new AutoResetEvent initially set to false this.PopupStarted = new AutoResetEvent(false); //and wait until the second thread signals to proceed this.PopupStarted.WaitOne(); } public void Stop() { if (this.Popup != null) { //need to use the dispatcher to call the Close method, because the window is created in another thread, and this method is called by the main thread this.Popup.Dispatcher.BeginInvoke(new Action(() => { this.Popup.Close(); })); } } } } }