|
|
|
@ -20,6 +20,9 @@ namespace Avalonia.Controls |
|
|
|
public static readonly AvaloniaProperty<Transform> LayoutTransformProperty = |
|
|
|
AvaloniaProperty.Register<LayoutTransformControl, Transform>(nameof(LayoutTransform)); |
|
|
|
|
|
|
|
public static readonly AvaloniaProperty<bool> UseRenderTransformProperty = |
|
|
|
AvaloniaProperty.Register<LayoutTransformControl, bool>(nameof(LayoutTransform)); |
|
|
|
|
|
|
|
static LayoutTransformControl() |
|
|
|
{ |
|
|
|
ClipToBoundsProperty.OverrideDefaultValue<LayoutTransformControl>(true); |
|
|
|
@ -29,6 +32,7 @@ namespace Avalonia.Controls |
|
|
|
|
|
|
|
ChildProperty.Changed |
|
|
|
.AddClassHandler<LayoutTransformControl>(x => x.OnChildChanged); |
|
|
|
UseRenderTransformProperty.Changed.AddClassHandler<LayoutTransformControl>(x => x.OnUseRenderTransformPropertyChanged); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -40,6 +44,15 @@ namespace Avalonia.Controls |
|
|
|
set { SetValue(LayoutTransformProperty, value); } |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Utilize the <see cref="RenderTransformProperty"/> for layout transforms.
|
|
|
|
/// </summary>
|
|
|
|
public bool UseRenderTransform |
|
|
|
{ |
|
|
|
get { return GetValue(UseRenderTransformProperty); } |
|
|
|
set { SetValue(UseRenderTransformProperty, value); } |
|
|
|
} |
|
|
|
|
|
|
|
public IControl TransformRoot => Child; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -134,6 +147,42 @@ namespace Avalonia.Controls |
|
|
|
return transformedDesiredSize; |
|
|
|
} |
|
|
|
|
|
|
|
IDisposable _renderTransformChangedEvent; |
|
|
|
|
|
|
|
private void OnUseRenderTransformPropertyChanged(AvaloniaPropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
// HACK: In theory, this method and the UseRenderTransform shouldn't exist but
|
|
|
|
// it's hard to animate this particular control with style animations without
|
|
|
|
// PropertyPaths.
|
|
|
|
//
|
|
|
|
// So until we get that implemented, we'll stick on this not-so-good
|
|
|
|
// workaround.
|
|
|
|
|
|
|
|
var target = e.Sender as LayoutTransformControl; |
|
|
|
var shouldUseRenderTransform = (bool)e.NewValue; |
|
|
|
if (target != null) |
|
|
|
{ |
|
|
|
if (shouldUseRenderTransform) |
|
|
|
{ |
|
|
|
_renderTransformChangedEvent = RenderTransformProperty.Changed |
|
|
|
.Subscribe( |
|
|
|
(x) => |
|
|
|
{ |
|
|
|
var target2 = x.Sender as LayoutTransformControl; |
|
|
|
if (target2 != null) |
|
|
|
{ |
|
|
|
target2.LayoutTransform = target2.RenderTransform; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_renderTransformChangedEvent?.Dispose(); |
|
|
|
LayoutTransform = null; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void OnChildChanged(AvaloniaPropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
if (null != TransformRoot) |
|
|
|
|