diff --git a/src/Avalonia.Controls/ApiCompatBaseline.txt b/src/Avalonia.Controls/ApiCompatBaseline.txt
index 0284463f1c..3a6810eed9 100644
--- a/src/Avalonia.Controls/ApiCompatBaseline.txt
+++ b/src/Avalonia.Controls/ApiCompatBaseline.txt
@@ -3,6 +3,7 @@ InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Control
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Controls.INativeMenuExporterEventsImplBridge.RaiseOpening()' is present in the implementation but not in the contract.
MembersMustExist : Member 'public void Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase.SetCursor(Avalonia.Platform.IPlatformHandle)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'public Avalonia.AvaloniaProperty Avalonia.AvaloniaProperty Avalonia.Controls.Notifications.NotificationCard.CloseOnClickProperty' does not exist in the implementation but it does exist in the contract.
+EnumValuesMustMatch : Enum value 'Avalonia.Platform.ExtendClientAreaChromeHints Avalonia.Platform.ExtendClientAreaChromeHints.Default' is (System.Int32)2 in the implementation but (System.Int32)1 in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.ICursorImpl)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.IPlatformHandle)' is present in the contract but not in the implementation.
MembersMustExist : Member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.IPlatformHandle)' does not exist in the implementation but it does exist in the contract.
diff --git a/src/Avalonia.Controls/Chrome/CaptionButtons.cs b/src/Avalonia.Controls/Chrome/CaptionButtons.cs
index cd60130c5b..be15d3d444 100644
--- a/src/Avalonia.Controls/Chrome/CaptionButtons.cs
+++ b/src/Avalonia.Controls/Chrome/CaptionButtons.cs
@@ -14,17 +14,21 @@ namespace Avalonia.Controls.Chrome
public class CaptionButtons : TemplatedControl
{
private CompositeDisposable? _disposables;
- private Window? _hostWindow;
- public void Attach(Window hostWindow)
+ ///
+ /// Currently attached window.
+ ///
+ protected Window? HostWindow { get; private set; }
+
+ public virtual void Attach(Window hostWindow)
{
if (_disposables == null)
{
- _hostWindow = hostWindow;
+ HostWindow = hostWindow;
_disposables = new CompositeDisposable
{
- _hostWindow.GetObservable(Window.WindowStateProperty)
+ HostWindow.GetObservable(Window.WindowStateProperty)
.Subscribe(x =>
{
PseudoClasses.Set(":minimized", x == WindowState.Minimized);
@@ -36,14 +40,45 @@ namespace Avalonia.Controls.Chrome
}
}
- public void Detach()
+ public virtual void Detach()
{
if (_disposables != null)
{
_disposables.Dispose();
_disposables = null;
- _hostWindow = null;
+ HostWindow = null;
+ }
+ }
+
+ protected virtual void OnClose()
+ {
+ HostWindow?.Close();
+ }
+
+ protected virtual void OnRestore()
+ {
+ if (HostWindow != null)
+ {
+ HostWindow.WindowState = HostWindow.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
+ }
+ }
+
+ protected virtual void OnMinimize()
+ {
+ if (HostWindow != null)
+ {
+ HostWindow.WindowState = WindowState.Minimized;
+ }
+ }
+
+ protected virtual void OnToggleFullScreen()
+ {
+ if (HostWindow != null)
+ {
+ HostWindow.WindowState = HostWindow.WindowState == WindowState.FullScreen
+ ? WindowState.Normal
+ : WindowState.FullScreen;
}
}
@@ -56,31 +91,13 @@ namespace Avalonia.Controls.Chrome
var minimiseButton = e.NameScope.Get("PART_MinimiseButton");
var fullScreenButton = e.NameScope.Get("PART_FullScreenButton");
- closeButton.PointerReleased += (sender, e) => _hostWindow?.Close();
+ closeButton.PointerReleased += (sender, e) => OnClose();
- restoreButton.PointerReleased += (sender, e) =>
- {
- if (_hostWindow != null)
- {
- _hostWindow.WindowState = _hostWindow.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
- }
- };
+ restoreButton.PointerReleased += (sender, e) => OnRestore();
- minimiseButton.PointerReleased += (sender, e) =>
- {
- if (_hostWindow != null)
- {
- _hostWindow.WindowState = WindowState.Minimized;
- }
- };
+ minimiseButton.PointerReleased += (sender, e) => OnMinimize();
- fullScreenButton.PointerReleased += (sender, e) =>
- {
- if (_hostWindow != null)
- {
- _hostWindow.WindowState = _hostWindow.WindowState == WindowState.FullScreen ? WindowState.Normal : WindowState.FullScreen;
- }
- };
+ fullScreenButton.PointerReleased += (sender, e) => OnToggleFullScreen();
}
}
}
diff --git a/src/Avalonia.Controls/Platform/ExtendClientAreaChromeHints.cs b/src/Avalonia.Controls/Platform/ExtendClientAreaChromeHints.cs
index de3f58886b..bb3c0288eb 100644
--- a/src/Avalonia.Controls/Platform/ExtendClientAreaChromeHints.cs
+++ b/src/Avalonia.Controls/Platform/ExtendClientAreaChromeHints.cs
@@ -16,7 +16,7 @@ namespace Avalonia.Platform
///
/// The default for the platform.
///
- Default = SystemChrome,
+ Default = PreferSystemChrome,
///
/// Use SystemChrome
diff --git a/src/Avalonia.Diagnostics/DevToolsExtensions.cs b/src/Avalonia.Diagnostics/DevToolsExtensions.cs
index 4bc2ca313f..aa585dca40 100644
--- a/src/Avalonia.Diagnostics/DevToolsExtensions.cs
+++ b/src/Avalonia.Diagnostics/DevToolsExtensions.cs
@@ -15,7 +15,7 @@ namespace Avalonia
/// The window to attach DevTools to.
public static void AttachDevTools(this TopLevel root)
{
- DevTools.Attach(root, new KeyGesture(Key.F12));
+ DevTools.Attach(root, new DevToolsOptions());
}
///
@@ -27,5 +27,15 @@ namespace Avalonia
{
DevTools.Attach(root, gesture);
}
+
+ ///
+ /// Attaches DevTools to a window, to be opened with the specified options.
+ ///
+ /// The window to attach DevTools to.
+ /// Additional settings of DevTools.
+ public static void AttachDevTools(this TopLevel root, DevToolsOptions options)
+ {
+ DevTools.Attach(root, options);
+ }
}
}
diff --git a/src/Avalonia.Diagnostics/Diagnostics/DevTools.cs b/src/Avalonia.Diagnostics/Diagnostics/DevTools.cs
index 4899be2955..7942d22962 100644
--- a/src/Avalonia.Diagnostics/Diagnostics/DevTools.cs
+++ b/src/Avalonia.Diagnostics/Diagnostics/DevTools.cs
@@ -6,6 +6,8 @@ using Avalonia.Diagnostics.Views;
using Avalonia.Input;
using Avalonia.Interactivity;
+#nullable enable
+
namespace Avalonia.Diagnostics
{
public static class DevTools
@@ -13,12 +15,20 @@ namespace Avalonia.Diagnostics
private static readonly Dictionary s_open = new Dictionary();
public static IDisposable Attach(TopLevel root, KeyGesture gesture)
+ {
+ return Attach(root, new DevToolsOptions()
+ {
+ Gesture = gesture,
+ });
+ }
+
+ public static IDisposable Attach(TopLevel root, DevToolsOptions options)
{
void PreviewKeyDown(object sender, KeyEventArgs e)
{
- if (gesture.Matches(e))
+ if (options.Gesture.Matches(e))
{
- Open(root);
+ Open(root, options);
}
}
@@ -28,7 +38,9 @@ namespace Avalonia.Diagnostics
RoutingStrategies.Tunnel);
}
- public static IDisposable Open(TopLevel root)
+ public static IDisposable Open(TopLevel root) => Open(root, new DevToolsOptions());
+
+ public static IDisposable Open(TopLevel root, DevToolsOptions options)
{
if (s_open.TryGetValue(root, out var window))
{
@@ -38,15 +50,15 @@ namespace Avalonia.Diagnostics
{
window = new MainWindow
{
- Width = 1024,
- Height = 512,
Root = root,
+ Width = options.Size.Width,
+ Height = options.Size.Height,
};
window.Closed += DevToolsClosed;
s_open.Add(root, window);
- if (root is Window inspectedWindow)
+ if (options.ShowAsChildWindow && root is Window inspectedWindow)
{
window.Show(inspectedWindow);
}
diff --git a/src/Avalonia.Diagnostics/Diagnostics/DevToolsOptions.cs b/src/Avalonia.Diagnostics/Diagnostics/DevToolsOptions.cs
new file mode 100644
index 0000000000..ee46192207
--- /dev/null
+++ b/src/Avalonia.Diagnostics/Diagnostics/DevToolsOptions.cs
@@ -0,0 +1,26 @@
+using Avalonia.Input;
+
+namespace Avalonia.Diagnostics
+{
+ ///
+ /// Describes options used to customize DevTools.
+ ///
+ public class DevToolsOptions
+ {
+ ///
+ /// Gets or sets the key gesture used to open DevTools.
+ ///
+ public KeyGesture Gesture { get; set; } = new KeyGesture(Key.F12);
+
+ ///
+ /// Gets or sets a value indicating whether DevTools should be displayed as a child window
+ /// of the window being inspected. The default value is true.
+ ///
+ public bool ShowAsChildWindow { get; set; } = true;
+
+ ///
+ /// Gets or sets the initial size of the DevTools window. The default value is 1024x512.
+ ///
+ public Size Size { get; set; } = new Size(1024, 512);
+ }
+}
diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl
index 9cada1120a..adcbeb2d3a 100644
--- a/src/Avalonia.Native/avn.idl
+++ b/src/Avalonia.Native/avn.idl
@@ -397,7 +397,7 @@ enum AvnExtendClientAreaChromeHints
AvnSystemChrome = 0x01,
AvnPreferSystemChrome = 0x02,
AvnOSXThickTitleBar = 0x08,
- AvnDefaultChrome = AvnSystemChrome,
+ AvnDefaultChrome = AvnPreferSystemChrome,
}
[uuid(809c652e-7396-11d2-9771-00a0c9b4d50c)]