diff --git a/Perspex.Windows/Window.cs b/Perspex.Windows/Window.cs
index 41f24927e2..ba6ccf6bc5 100644
--- a/Perspex.Windows/Window.cs
+++ b/Perspex.Windows/Window.cs
@@ -23,7 +23,7 @@ namespace Perspex.Windows
using Perspex.Windows.Threading;
using Splat;
- public class Window : ContentControl, ILayoutRoot, IRendered
+ public class Window : ContentControl, ILayoutRoot, IRendered, ICloseable
{
private UnmanagedMethods.WndProc wndProcDelegate;
@@ -75,6 +75,8 @@ namespace Perspex.Windows
});
}
+ public event EventHandler Closed;
+
public Size ClientSize
{
get
@@ -166,6 +168,14 @@ namespace Perspex.Windows
}
}
+ private void OnClosed()
+ {
+ if (this.Closed != null)
+ {
+ this.Closed(this, EventArgs.Empty);
+ }
+ }
+
[SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")]
private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
{
@@ -175,9 +185,9 @@ namespace Perspex.Windows
switch ((UnmanagedMethods.WindowsMessage)msg)
{
- ////case UnmanagedMethods.WindowsMessage.WM_DESTROY:
- //// this.OnClosed();
- //// break;
+ case UnmanagedMethods.WindowsMessage.WM_DESTROY:
+ this.OnClosed();
+ break;
case UnmanagedMethods.WindowsMessage.WM_KEYDOWN:
WindowsKeyboardDevice.Instance.UpdateKeyStates();
diff --git a/Perspex/Application.cs b/Perspex/Application.cs
index 9e7127c46e..13dcfe0c7d 100644
--- a/Perspex/Application.cs
+++ b/Perspex/Application.cs
@@ -6,9 +6,11 @@
namespace Perspex
{
+ using System.Threading;
using Perspex.Controls;
using Perspex.Input;
using Perspex.Styling;
+ using Perspex.Threading;
using Splat;
public class Application
@@ -85,5 +87,12 @@ namespace Perspex
Locator.CurrentMutable.Register(() => this.InputManager, typeof(IInputManager));
Locator.CurrentMutable.Register(() => styler, typeof(IStyler));
}
+
+ public void Run(ICloseable closable)
+ {
+ DispatcherFrame frame = new DispatcherFrame();
+ closable.Closed += (s, e) => frame.Continue = false;
+ Dispatcher.PushFrame(frame);
+ }
}
}
diff --git a/Perspex/ICloseable.cs b/Perspex/ICloseable.cs
new file mode 100644
index 0000000000..23ec938f4f
--- /dev/null
+++ b/Perspex/ICloseable.cs
@@ -0,0 +1,15 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2014 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex
+{
+ using System;
+
+ public interface ICloseable
+ {
+ event EventHandler Closed;
+ }
+}
diff --git a/Perspex/Perspex.csproj b/Perspex/Perspex.csproj
index a045aeac5a..831f718420 100644
--- a/Perspex/Perspex.csproj
+++ b/Perspex/Perspex.csproj
@@ -101,6 +101,7 @@
+
diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs
index e01e484606..d5ec5d53a2 100644
--- a/TestApplication/Program.cs
+++ b/TestApplication/Program.cs
@@ -234,7 +234,7 @@ namespace TestApplication
};
window.Show();
- Dispatcher.Run();
+ Application.Current.Run(window);
}
}
}