diff --git a/src/Avalonia.Controls/Platform/IWindowImpl.cs b/src/Avalonia.Controls/Platform/IWindowImpl.cs
index 609e9834cb..08899d5c14 100644
--- a/src/Avalonia.Controls/Platform/IWindowImpl.cs
+++ b/src/Avalonia.Controls/Platform/IWindowImpl.cs
@@ -28,6 +28,7 @@ namespace Avalonia.Platform
///
/// An that should be used to close the window.
///
+ [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
IDisposable ShowDialog();
///
diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs
index 40c52a748d..0a1fb55ced 100644
--- a/src/Avalonia.Controls/Window.cs
+++ b/src/Avalonia.Controls/Window.cs
@@ -11,6 +11,8 @@ using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Styling;
using System.Collections.Generic;
+using System.Linq;
+using System.Reactive.Disposables;
namespace Avalonia.Controls
{
@@ -45,7 +47,7 @@ namespace Avalonia.Controls
///
public class Window : TopLevel, IStyleable, IFocusScope, ILayoutRoot, INameScope
{
- private static IList s_windows = new List();
+ private static IList s_windows = new List();
///
/// Retrieves an enumeration of all Windows in the currently running application.
@@ -89,7 +91,7 @@ namespace Avalonia.Controls
TitleProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl.SetTitle((string)e.NewValue));
HasSystemDecorationsProperty.Changed.AddClassHandler(
(s, e) => s.PlatformImpl.SetSystemDecorations((bool) e.NewValue));
-
+
IconProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl.SetIcon(((WindowIcon)e.NewValue).PlatformImpl));
}
@@ -180,7 +182,7 @@ namespace Avalonia.Controls
Size ILayoutRoot.MaxClientSize => _maxPlatformClientSize;
///
- Type IStyleable.StyleKey => typeof(Window);
+ Type IStyleable.StyleKey => typeof(Window);
///
/// Closes the window.
@@ -238,7 +240,7 @@ namespace Avalonia.Controls
PlatformImpl.Show();
}
}
-
+
///
/// Shows the window as a dialog.
///
@@ -263,14 +265,14 @@ namespace Avalonia.Controls
{
s_windows.Add(this);
- EnsureInitialized();
- LayoutManager.Instance.ExecuteInitialLayoutPass(this);
+ EnsureInitialized();
+ LayoutManager.Instance.ExecuteInitialLayoutPass(this);
using (BeginAutoSizing())
{
- var modal = PlatformImpl.ShowDialog();
+ var modal = GetModal();
var result = new TaskCompletionSource();
-
+
Observable.FromEventPattern(this, nameof(Closed))
.Take(1)
.Subscribe(_ =>
@@ -282,6 +284,32 @@ namespace Avalonia.Controls
return result.Task;
}
}
+
+ private IDisposable GetModal()
+ {
+ var disabled = s_windows.Where(w => w.IsEnabled && w != this);
+ Window activated = null;
+ foreach (var window in disabled)
+ {
+ if (window.IsActive)
+ {
+ activated = window;
+ }
+
+ window.IsEnabled = false;
+ }
+
+ PlatformImpl.Show();
+
+ return Disposable.Create(() =>
+ {
+ foreach (var window in disabled)
+ {
+ window.IsEnabled = true;
+ }
+ activated?.Activate();
+ });
+ }
///
void INameScope.Register(string name, object element)
@@ -307,7 +335,7 @@ namespace Avalonia.Controls
var sizeToContent = SizeToContent;
var size = ClientSize;
var desired = base.MeasureOverride(availableSize.Constrain(_maxPlatformClientSize));
-
+
switch (sizeToContent)
{
case SizeToContent.Width:
@@ -348,7 +376,7 @@ namespace Avalonia.Controls
init.BeginInit();
init.EndInit();
}
- }
+ }
}
}
diff --git a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs
index a5a34cd47b..5ef1788073 100644
--- a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs
+++ b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs
@@ -45,6 +45,7 @@ namespace Avalonia.Gtk
{
}
+ [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
public override IDisposable ShowDialog() => Disposable.Create(() => { });
public override void SetSystemDecorations(bool enabled)
diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs
index eca7c24136..c82ded1263 100644
--- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs
+++ b/src/Gtk/Avalonia.Gtk/WindowImpl.cs
@@ -108,6 +108,7 @@ namespace Avalonia.Gtk
}
}
+ [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
public override IDisposable ShowDialog()
{
Window.Modal = true;
diff --git a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs b/src/Gtk/Avalonia.Gtk/WindowImplBase.cs
index db4b5e9dde..97641ed22c 100644
--- a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs
+++ b/src/Gtk/Avalonia.Gtk/WindowImplBase.cs
@@ -167,6 +167,7 @@ namespace Avalonia.Gtk
}
public abstract void SetTitle(string title);
+ [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
public abstract IDisposable ShowDialog();
public abstract void SetSystemDecorations(bool enabled);
public abstract void SetIcon(IWindowIconImpl icon);
diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs
index 9680f31973..c3cbb0e449 100644
--- a/src/Windows/Avalonia.Win32/WindowImpl.cs
+++ b/src/Windows/Avalonia.Win32/WindowImpl.cs
@@ -136,7 +136,7 @@ namespace Avalonia.Win32
public WindowState WindowState
{
get
- {
+ {
var placement = default(UnmanagedMethods.WINDOWPLACEMENT);
UnmanagedMethods.GetWindowPlacement(_hwnd, ref placement);
@@ -175,7 +175,7 @@ namespace Avalonia.Win32
}
public IPopupImpl CreatePopup()
- {
+ {
return new PopupImpl();
}
@@ -332,6 +332,7 @@ namespace Avalonia.Win32
}
}
+ [Obsolete("Use Avalonia.Controls.Window.ShowDialog() instead.")]
public virtual IDisposable ShowDialog()
{
var disabled = s_instances.Where(x => x != this && x.IsEnabled).ToList();