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.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)