diff --git a/packages/Avalonia/AvaloniaBuildTasks.targets b/packages/Avalonia/AvaloniaBuildTasks.targets
index 45a7f1aa44..de3830ffea 100644
--- a/packages/Avalonia/AvaloniaBuildTasks.targets
+++ b/packages/Avalonia/AvaloniaBuildTasks.targets
@@ -42,12 +42,24 @@
- $(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences
+ $(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences;_GenerateAvaloniaResourcesDependencyCache
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia.Controls/Design.cs b/src/Avalonia.Controls/Design.cs
index 0d05e19e53..07d2918a88 100644
--- a/src/Avalonia.Controls/Design.cs
+++ b/src/Avalonia.Controls/Design.cs
@@ -60,6 +60,19 @@ namespace Avalonia.Controls
return target.GetValue(PreviewWithProperty);
}
+ public static readonly AttachedProperty DesignStyleProperty = AvaloniaProperty
+ .RegisterAttached("DesignStyle", typeof(Design));
+
+ public static void SetDesignStyle(Control control, IStyle value)
+ {
+ control.SetValue(DesignStyleProperty, value);
+ }
+
+ public static IStyle GetDesignStyle(Control control)
+ {
+ return control.GetValue(DesignStyleProperty);
+ }
+
public static void ApplyDesignModeProperties(Control target, Control source)
{
if (source.IsSet(WidthProperty))
@@ -68,6 +81,8 @@ namespace Avalonia.Controls
target.Height = source.GetValue(HeightProperty);
if (source.IsSet(DataContextProperty))
target.DataContext = source.GetValue(DataContextProperty);
+ if (source.IsSet(DesignStyleProperty))
+ target.Styles.Add(source.GetValue(DesignStyleProperty));
}
}
}
diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
index 209feb351c..726d2c596c 100644
--- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
+++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
@@ -303,7 +303,8 @@ namespace Avalonia.Controls.Platform
{
item.Parent.SelectedItem.Close();
SelectItemAndAncestors(item);
- Open(item, false);
+ if (item.HasSubMenu)
+ Open(item, false);
}
else
{
diff --git a/src/Avalonia.Themes.Fluent/Controls/NotificationCard.xaml b/src/Avalonia.Themes.Fluent/Controls/NotificationCard.xaml
index c06b501f82..924d977eb5 100644
--- a/src/Avalonia.Themes.Fluent/Controls/NotificationCard.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/NotificationCard.xaml
@@ -17,7 +17,7 @@
-
+
-
+
-
-
+
+
diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
index 3bd8e05ee2..6c84cfd55c 100644
--- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
+++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
@@ -35,6 +35,8 @@ namespace Avalonia.Rendering
private IRef _currentDraw;
private readonly IDeferredRendererLock _lock;
private readonly object _sceneLock = new object();
+ private readonly object _startStopLock = new object();
+ private readonly object _renderLoopIsRenderingLock = new object();
private readonly Action _updateSceneIfNeededDelegate;
///
@@ -139,6 +141,8 @@ namespace Avalonia.Rendering
}
Stop();
+ // Wait for any in-progress rendering to complete
+ lock(_renderLoopIsRenderingLock){}
DisposeRenderTarget();
}
@@ -233,20 +237,26 @@ namespace Avalonia.Rendering
///
public void Start()
{
- if (!_running && _renderLoop != null)
+ lock (_startStopLock)
{
- _renderLoop.Add(this);
- _running = true;
+ if (!_running && _renderLoop != null)
+ {
+ _renderLoop.Add(this);
+ _running = true;
+ }
}
}
///
public void Stop()
{
- if (_running && _renderLoop != null)
+ lock (_startStopLock)
{
- _renderLoop.Remove(this);
- _running = false;
+ if (_running && _renderLoop != null)
+ {
+ _renderLoop.Remove(this);
+ _running = false;
+ }
}
}
@@ -255,7 +265,16 @@ namespace Avalonia.Rendering
void IRenderLoopTask.Update(TimeSpan time) => UpdateScene();
- void IRenderLoopTask.Render() => Render(false);
+ void IRenderLoopTask.Render()
+ {
+ lock (_renderLoopIsRenderingLock)
+ {
+ lock(_startStopLock)
+ if(!_running)
+ return;
+ Render(false);
+ }
+ }
///
Size IVisualBrushRenderer.GetRenderTargetSize(IVisualBrush brush)
diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs
index 149d7fb9b2..f0d2d5ca8a 100644
--- a/src/Avalonia.X11/X11Window.cs
+++ b/src/Avalonia.X11/X11Window.cs
@@ -805,13 +805,14 @@ namespace Avalonia.X11
if (_handle != IntPtr.Zero)
{
- XDestroyWindow(_x11.Display, _handle);
_platform.Windows.Remove(_handle);
_platform.XI2?.OnWindowDestroyed(_handle);
+ var handle = _handle;
_handle = IntPtr.Zero;
Closed?.Invoke();
_mouse.Dispose();
_touch.Dispose();
+ XDestroyWindow(_x11.Display, handle);
}
if (_useRenderWindow && _renderHandle != IntPtr.Zero)
diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
index 1f186396ab..d812f6a059 100644
--- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
+++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
@@ -164,7 +164,7 @@ namespace Avalonia.Skia
///
public void DrawLine(IPen pen, Point p1, Point p2)
{
- using (var paint = CreatePaint(_strokePaint, pen, new Rect(p1, p2).Normalize()))
+ using (var paint = CreatePaint(_strokePaint, pen, new Size(Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y))))
{
if (paint.Paint is object)
{
@@ -177,10 +177,10 @@ namespace Avalonia.Skia
public void DrawGeometry(IBrush brush, IPen pen, IGeometryImpl geometry)
{
var impl = (GeometryImpl) geometry;
- var rect = geometry.Bounds;
+ var size = geometry.Bounds.Size;
- using (var fill = brush != null ? CreatePaint(_fillPaint, brush, rect) : default(PaintWrapper))
- using (var stroke = pen?.Brush != null ? CreatePaint(_strokePaint, pen, rect) : default(PaintWrapper))
+ using (var fill = brush != null ? CreatePaint(_fillPaint, brush, size) : default(PaintWrapper))
+ using (var stroke = pen?.Brush != null ? CreatePaint(_strokePaint, pen, size) : default(PaintWrapper))
{
if (fill.Paint != null)
{
@@ -354,7 +354,7 @@ namespace Avalonia.Skia
if (brush != null)
{
- using (var paint = CreatePaint(_fillPaint, brush, rect.Rect))
+ using (var paint = CreatePaint(_fillPaint, brush, rect.Rect.Size))
{
if (isRounded)
{
@@ -397,7 +397,7 @@ namespace Avalonia.Skia
if (pen?.Brush != null)
{
- using (var paint = CreatePaint(_strokePaint, pen, rect.Rect))
+ using (var paint = CreatePaint(_strokePaint, pen, rect.Rect.Size))
{
if (paint.Paint is object)
{
@@ -417,7 +417,7 @@ namespace Avalonia.Skia
///
public void DrawText(IBrush foreground, Point origin, IFormattedTextImpl text)
{
- using (var paint = CreatePaint(_fillPaint, foreground, text.Bounds))
+ using (var paint = CreatePaint(_fillPaint, foreground, text.Bounds.Size))
{
var textImpl = (FormattedTextImpl) text;
textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint, _canTextUseLcdRendering);
@@ -427,7 +427,7 @@ namespace Avalonia.Skia
///
public void DrawGlyphRun(IBrush foreground, GlyphRun glyphRun)
{
- using (var paintWrapper = CreatePaint(_fillPaint, foreground, new Rect(glyphRun.Size)))
+ using (var paintWrapper = CreatePaint(_fillPaint, foreground, glyphRun.Size))
{
var glyphRunImpl = (GlyphRunImpl)glyphRun.GlyphRunImpl;
@@ -537,7 +537,7 @@ namespace Avalonia.Skia
var paint = new SKPaint();
Canvas.SaveLayer(paint);
- _maskStack.Push(CreatePaint(paint, mask, bounds, true));
+ _maskStack.Push(CreatePaint(paint, mask, bounds.Size, true));
}
///
@@ -593,19 +593,18 @@ namespace Avalonia.Skia
/// Paint wrapper.
/// Target bound rect.
/// Gradient brush.
- private void ConfigureGradientBrush(ref PaintWrapper paintWrapper, Rect targetRect, IGradientBrush gradientBrush)
+ private void ConfigureGradientBrush(ref PaintWrapper paintWrapper, Size targetSize, IGradientBrush gradientBrush)
{
var tileMode = gradientBrush.SpreadMethod.ToSKShaderTileMode();
var stopColors = gradientBrush.GradientStops.Select(s => s.Color.ToSKColor()).ToArray();
var stopOffsets = gradientBrush.GradientStops.Select(s => (float)s.Offset).ToArray();
- var position = targetRect.Position.ToSKPoint();
switch (gradientBrush)
{
case ILinearGradientBrush linearGradient:
{
- var start = position + linearGradient.StartPoint.ToPixels(targetRect.Size).ToSKPoint();
- var end = position + linearGradient.EndPoint.ToPixels(targetRect.Size).ToSKPoint();
+ var start = linearGradient.StartPoint.ToPixels(targetSize).ToSKPoint();
+ var end = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint();
// would be nice to cache these shaders possibly?
using (var shader =
@@ -618,10 +617,10 @@ namespace Avalonia.Skia
}
case IRadialGradientBrush radialGradient:
{
- var center = position + radialGradient.Center.ToPixels(targetRect.Size).ToSKPoint();
- var radius = (float)(radialGradient.Radius * targetRect.Width);
+ var center = radialGradient.Center.ToPixels(targetSize).ToSKPoint();
+ var radius = (float)(radialGradient.Radius * targetSize.Width);
- var origin = position + radialGradient.GradientOrigin.ToPixels(targetRect.Size).ToSKPoint();
+ var origin = radialGradient.GradientOrigin.ToPixels(targetSize).ToSKPoint();
if (origin.Equals(center))
{
@@ -666,7 +665,7 @@ namespace Avalonia.Skia
}
case IConicGradientBrush conicGradient:
{
- var center = position + conicGradient.Center.ToPixels(targetRect.Size).ToSKPoint();
+ var center = conicGradient.Center.ToPixels(targetSize).ToSKPoint();
// Skia's default is that angle 0 is from the right hand side of the center point
// but we are matching CSS where the vertical point above the center is 0.
@@ -868,10 +867,10 @@ namespace Avalonia.Skia
///
/// The paint to wrap.
/// Source brush.
- /// Target rect.
+ /// Target size.
/// Optional dispose of the supplied paint.
/// Paint wrapper for given brush.
- internal PaintWrapper CreatePaint(SKPaint paint, IBrush brush, Rect targetRect, bool disposePaint = false)
+ internal PaintWrapper CreatePaint(SKPaint paint, IBrush brush, Size targetSize, bool disposePaint = false)
{
var paintWrapper = new PaintWrapper(paint, disposePaint);
@@ -890,7 +889,7 @@ namespace Avalonia.Skia
if (brush is IGradientBrush gradient)
{
- ConfigureGradientBrush(ref paintWrapper, targetRect, gradient);
+ ConfigureGradientBrush(ref paintWrapper, targetSize, gradient);
return paintWrapper;
}
@@ -910,7 +909,7 @@ namespace Avalonia.Skia
if (tileBrush != null && tileBrushImage != null)
{
- ConfigureTileBrush(ref paintWrapper, targetRect.Size, tileBrush, tileBrushImage);
+ ConfigureTileBrush(ref paintWrapper, targetSize, tileBrush, tileBrushImage);
}
else
{
@@ -925,10 +924,10 @@ namespace Avalonia.Skia
///
/// The paint to wrap.
/// Source pen.
- /// Target rect.
+ /// Target size.
/// Optional dispose of the supplied paint.
///
- private PaintWrapper CreatePaint(SKPaint paint, IPen pen, Rect targetRect, bool disposePaint = false)
+ private PaintWrapper CreatePaint(SKPaint paint, IPen pen, Size targetSize, bool disposePaint = false)
{
// In Skia 0 thickness means - use hairline rendering
// and for us it means - there is nothing rendered.
@@ -937,7 +936,7 @@ namespace Avalonia.Skia
return default;
}
- var rv = CreatePaint(paint, pen.Brush, targetRect, disposePaint);
+ var rv = CreatePaint(paint, pen.Brush, targetSize, disposePaint);
paint.IsStroke = true;
paint.StrokeWidth = (float) pen.Thickness;
diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
index 3eca42faa9..5f4980e461 100644
--- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
+++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
@@ -278,9 +278,9 @@ namespace Avalonia.Skia
if (fb != null)
{
- //TODO: figure out how to get the brush rect
+ //TODO: figure out how to get the brush size
currentWrapper = context.CreatePaint(new SKPaint { IsAntialias = true }, fb,
- default);
+ new Size());
}
else
{
diff --git a/src/Windows/Avalonia.Direct2D1/Media/AvaloniaTextRenderer.cs b/src/Windows/Avalonia.Direct2D1/Media/AvaloniaTextRenderer.cs
index e4b2405290..22c998df93 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/AvaloniaTextRenderer.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/AvaloniaTextRenderer.cs
@@ -34,10 +34,10 @@ namespace Avalonia.Direct2D1.Media
{
var wrapper = clientDrawingEffect as BrushWrapper;
- // TODO: Work out how to get the rect below rather than passing default.
+ // TODO: Work out how to get the size below rather than passing new Size().
var brush = (wrapper == null) ?
_foreground :
- _context.CreateBrush(wrapper.Brush, default).PlatformBrush;
+ _context.CreateBrush(wrapper.Brush, new Size()).PlatformBrush;
_renderTarget.DrawGlyphRun(
new RawVector2 { X = baselineOriginX, Y = baselineOriginY },
diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
index 09e5b7c71a..622f47f953 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
@@ -192,7 +192,7 @@ namespace Avalonia.Direct2D1.Media
{
using (var d2dSource = ((BitmapImpl)source.Item).GetDirect2DBitmap(_deviceContext))
using (var sourceBrush = new BitmapBrush(_deviceContext, d2dSource.Value))
- using (var d2dOpacityMask = CreateBrush(opacityMask, opacityMaskRect))
+ using (var d2dOpacityMask = CreateBrush(opacityMask, opacityMaskRect.Size))
using (var geometry = new SharpDX.Direct2D1.RectangleGeometry(Direct2D1Platform.Direct2D1Factory, destRect.ToDirect2D()))
{
if (d2dOpacityMask.PlatformBrush != null)
@@ -217,7 +217,9 @@ namespace Avalonia.Direct2D1.Media
{
if (pen != null)
{
- using (var d2dBrush = CreateBrush(pen.Brush, new Rect(p1, p2).Normalize()))
+ var size = new Rect(p1, p2).Size;
+
+ using (var d2dBrush = CreateBrush(pen.Brush, size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(_deviceContext))
{
if (d2dBrush.PlatformBrush != null)
@@ -243,7 +245,7 @@ namespace Avalonia.Direct2D1.Media
{
if (brush != null)
{
- using (var d2dBrush = CreateBrush(brush, geometry.Bounds))
+ using (var d2dBrush = CreateBrush(brush, geometry.Bounds.Size))
{
if (d2dBrush.PlatformBrush != null)
{
@@ -255,7 +257,7 @@ namespace Avalonia.Direct2D1.Media
if (pen != null)
{
- using (var d2dBrush = CreateBrush(pen.Brush, geometry.GetRenderBounds(pen)))
+ using (var d2dBrush = CreateBrush(pen.Brush, geometry.GetRenderBounds(pen).Size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(_deviceContext))
{
if (d2dBrush.PlatformBrush != null)
@@ -280,7 +282,7 @@ namespace Avalonia.Direct2D1.Media
if (brush != null)
{
- using (var b = CreateBrush(brush, rect))
+ using (var b = CreateBrush(brush, rect.Size))
{
if (b.PlatformBrush != null)
{
@@ -309,7 +311,7 @@ namespace Avalonia.Direct2D1.Media
if (pen?.Brush != null)
{
- using (var wrapper = CreateBrush(pen.Brush, rect))
+ using (var wrapper = CreateBrush(pen.Brush, rect.Size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(_deviceContext))
{
if (wrapper.PlatformBrush != null)
@@ -347,7 +349,7 @@ namespace Avalonia.Direct2D1.Media
{
var impl = (FormattedTextImpl)text;
- using (var brush = CreateBrush(foreground, impl.Bounds))
+ using (var brush = CreateBrush(foreground, impl.Bounds.Size))
using (var renderer = new AvaloniaTextRenderer(this, _deviceContext, brush.PlatformBrush))
{
if (brush.PlatformBrush != null)
@@ -365,7 +367,7 @@ namespace Avalonia.Direct2D1.Media
/// The glyph run.
public void DrawGlyphRun(IBrush foreground, GlyphRun glyphRun)
{
- using (var brush = CreateBrush(foreground, new Rect(glyphRun.Size)))
+ using (var brush = CreateBrush(foreground, glyphRun.Size))
{
var glyphRunImpl = (GlyphRunImpl)glyphRun.GlyphRunImpl;
@@ -456,9 +458,9 @@ namespace Avalonia.Direct2D1.Media
/// Creates a Direct2D brush wrapper for a Avalonia brush.
///
/// The avalonia brush.
- /// The brush's target area.
+ /// The size of the brush's target area.
/// The Direct2D brush wrapper.
- public BrushImpl CreateBrush(IBrush brush, Rect destinationRect)
+ public BrushImpl CreateBrush(IBrush brush, Size destinationSize)
{
var solidColorBrush = brush as ISolidColorBrush;
var linearGradientBrush = brush as ILinearGradientBrush;
@@ -473,11 +475,11 @@ namespace Avalonia.Direct2D1.Media
}
else if (linearGradientBrush != null)
{
- return new LinearGradientBrushImpl(linearGradientBrush, _deviceContext, destinationRect);
+ return new LinearGradientBrushImpl(linearGradientBrush, _deviceContext, destinationSize);
}
else if (radialGradientBrush != null)
{
- return new RadialGradientBrushImpl(radialGradientBrush, _deviceContext, destinationRect);
+ return new RadialGradientBrushImpl(radialGradientBrush, _deviceContext, destinationSize);
}
else if (conicGradientBrush != null)
{
@@ -490,7 +492,7 @@ namespace Avalonia.Direct2D1.Media
imageBrush,
_deviceContext,
(BitmapImpl)imageBrush.Source.PlatformImpl.Item,
- destinationRect.Size);
+ destinationSize);
}
else if (visualBrush != null)
{
@@ -521,7 +523,7 @@ namespace Avalonia.Direct2D1.Media
visualBrush,
_deviceContext,
new D2DBitmapImpl(intermediate.Bitmap),
- destinationRect.Size);
+ destinationSize);
}
}
}
@@ -573,7 +575,7 @@ namespace Avalonia.Direct2D1.Media
ContentBounds = PrimitiveExtensions.RectangleInfinite,
MaskTransform = PrimitiveExtensions.Matrix3x2Identity,
Opacity = 1,
- OpacityBrush = CreateBrush(mask, bounds).PlatformBrush
+ OpacityBrush = CreateBrush(mask, bounds.Size).PlatformBrush
};
var layer = _layerPool.Count != 0 ? _layerPool.Pop() : new Layer(_deviceContext);
_deviceContext.PushLayer(ref parameters, layer);
diff --git a/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
index 69b45455ac..0e63d4cc03 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
@@ -8,7 +8,7 @@ namespace Avalonia.Direct2D1.Media
public LinearGradientBrushImpl(
ILinearGradientBrush brush,
SharpDX.Direct2D1.RenderTarget target,
- Rect destinationRect)
+ Size destinationSize)
{
if (brush.GradientStops.Count == 0)
{
@@ -21,9 +21,8 @@ namespace Avalonia.Direct2D1.Media
Position = (float)s.Offset
}).ToArray();
- var position = destinationRect.Position;
- var startPoint = position + brush.StartPoint.ToPixels(destinationRect.Size);
- var endPoint = position + brush.EndPoint.ToPixels(destinationRect.Size);
+ var startPoint = brush.StartPoint.ToPixels(destinationSize);
+ var endPoint = brush.EndPoint.ToPixels(destinationSize);
using (var stops = new SharpDX.Direct2D1.GradientStopCollection(
target,
diff --git a/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs
index 7dcfd7e1e0..1fca6d4e33 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs
@@ -8,7 +8,7 @@ namespace Avalonia.Direct2D1.Media
public RadialGradientBrushImpl(
IRadialGradientBrush brush,
SharpDX.Direct2D1.RenderTarget target,
- Rect destinationRect)
+ Size destinationSize)
{
if (brush.GradientStops.Count == 0)
{
@@ -21,13 +21,12 @@ namespace Avalonia.Direct2D1.Media
Position = (float)s.Offset
}).ToArray();
- var position = destinationRect.Position;
- var centerPoint = position + brush.Center.ToPixels(destinationRect.Size);
- var gradientOrigin = position + brush.GradientOrigin.ToPixels(destinationRect.Size) - centerPoint;
+ var centerPoint = brush.Center.ToPixels(destinationSize);
+ var gradientOrigin = brush.GradientOrigin.ToPixels(destinationSize) - centerPoint;
// Note: Direct2D supports RadiusX and RadiusY but Cairo backend supports only Radius property
- var radiusX = brush.Radius * destinationRect.Width;
- var radiusY = brush.Radius * destinationRect.Height;
+ var radiusX = brush.Radius * destinationSize.Width;
+ var radiusY = brush.Radius * destinationSize.Height;
using (var stops = new SharpDX.Direct2D1.GradientStopCollection(
target,
diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
index ad409810b8..6a6bcc5715 100644
--- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
+++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
@@ -808,6 +808,31 @@ namespace Avalonia.Win32.Interop
MNC_SELECT = 3
}
+ public enum SysCommands
+ {
+ SC_SIZE = 0xF000,
+ SC_MOVE = 0xF010,
+ SC_MINIMIZE = 0xF020,
+ SC_MAXIMIZE = 0xF030,
+ SC_NEXTWINDOW = 0xF040,
+ SC_PREVWINDOW = 0xF050,
+ SC_CLOSE = 0xF060,
+ SC_VSCROLL = 0xF070,
+ SC_HSCROLL = 0xF080,
+ SC_MOUSEMENU = 0xF090,
+ SC_KEYMENU = 0xF100,
+ SC_ARRANGE = 0xF110,
+ SC_RESTORE = 0xF120,
+ SC_TASKLIST = 0xF130,
+ SC_SCREENSAVE = 0xF140,
+ SC_HOTKEY = 0xF150,
+ SC_DEFAULT = 0xF160,
+ SC_MONITORPOWER = 0xF170,
+ SC_CONTEXTHELP = 0xF180,
+ SC_SEPARATOR = 0xF00F,
+ SCF_ISSECURE = 0x00000001,
+ }
+
[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
index d163b3d068..f7ed2f215f 100644
--- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
+++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
@@ -123,6 +123,12 @@ namespace Avalonia.Win32
break;
}
+ case WindowsMessage.WM_SYSCOMMAND:
+ // Disable system handling of Alt/F10 menu keys.
+ if ((SysCommands)wParam == SysCommands.SC_KEYMENU && HighWord(ToInt32(lParam)) <= 0)
+ return IntPtr.Zero;
+ break;
+
case WindowsMessage.WM_MENUCHAR:
{
// mute the system beep
diff --git a/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs
index 3d2f09e2a8..ef400410a4 100644
--- a/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs
+++ b/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs
@@ -200,7 +200,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media
Child = new DrawnControl(c =>
{
c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
- c.DrawRectangle(brush, null, new Rect(100, 100, 100, 100));
+ using (c.PushPreTransform(Matrix.CreateTranslation(100, 100)))
+ c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
}),
};
diff --git a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs
index 28701f2f97..dd9d2f9b39 100644
--- a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs
+++ b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs
@@ -81,10 +81,10 @@ namespace Avalonia.Direct2D1.RenderTests.Media
StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
EndPoint = new RelativePoint(1, 1, RelativeUnit.Relative),
GradientStops =
- {
- new GradientStop { Color = Colors.Red, Offset = 0 },
- new GradientStop { Color = Colors.Blue, Offset = 1 }
- }
+ {
+ new GradientStop { Color = Colors.Red, Offset = 0 },
+ new GradientStop { Color = Colors.Blue, Offset = 1 }
+ }
};
Decorator target = new Decorator
@@ -94,7 +94,9 @@ namespace Avalonia.Direct2D1.RenderTests.Media
Child = new DrawnControl(c =>
{
c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
- c.DrawRectangle(brush, null, new Rect(100, 100, 100, 100));
+
+ using (c.PushPreTransform(Matrix.CreateTranslation(100, 100)))
+ c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
}),
};
diff --git a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs
index 95fae7f2fa..e52f844359 100644
--- a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs
+++ b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs
@@ -185,7 +185,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media
Child = new DrawnControl(c =>
{
c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
- c.DrawRectangle(brush, null, new Rect(100, 100, 100, 100));
+ using (c.PushPreTransform(Matrix.CreateTranslation(100, 100)))
+ c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
}),
};