Skip to content

Commit 35d0230

Browse files
Hook event into ResizeThumb to know when element has been changed so we can update Adorner
I'm not sure why the underlying element changed is not triggering the existing Adorner layout hooks, so this'll have to do for now... It at least works as expected now.
1 parent 31297b0 commit 35d0230

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

components/Adorners/src/Adorner.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ internal void OnLayoutUpdated(object? sender, object e)
9797

9898
Canvas.SetLeft(this, coord.X);
9999
Canvas.SetTop(this, coord.Y);
100+
101+
// Also update size
102+
OnSizeChanged(this, null!);
100103
}
101104
}
102105

@@ -134,4 +137,12 @@ protected virtual void OnAttached() { }
134137
/// Override this method to unhook functionality from the <see cref="AdornedElement"/>.
135138
/// </remarks>
136139
protected virtual void OnDetaching() { }
140+
141+
/// <inheritdoc/>
142+
public new void UpdateLayout()
143+
{
144+
OnLayoutUpdated(this, null!);
145+
146+
base.UpdateLayout();
147+
}
137148
}

components/Adorners/src/ResizeElement/ResizeElementAdorner.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,31 @@ protected override void OnAttached()
7777
TopRightThumbPart?.TargetControl = AdornedElement;
7878
BottomLeftThumbPart?.TargetControl = AdornedElement;
7979
BottomRightThumbPart?.TargetControl = AdornedElement;
80+
81+
TopThumbPart?.TargetControlResized += OnTargetControlResized;
82+
BottomThumbPart?.TargetControlResized += OnTargetControlResized;
83+
LeftThumbPart?.TargetControlResized += OnTargetControlResized;
84+
RightThumbPart?.TargetControlResized += OnTargetControlResized;
85+
TopLeftThumbPart?.TargetControlResized += OnTargetControlResized;
86+
TopRightThumbPart?.TargetControlResized += OnTargetControlResized;
87+
BottomLeftThumbPart?.TargetControlResized += OnTargetControlResized;
88+
BottomRightThumbPart?.TargetControlResized += OnTargetControlResized;
8089
}
8190

8291
/// <inheritdoc/>
8392
protected override void OnDetaching()
8493
{
8594
base.OnDetaching();
8695

96+
TopThumbPart?.TargetControlResized -= OnTargetControlResized;
97+
BottomThumbPart?.TargetControlResized -= OnTargetControlResized;
98+
LeftThumbPart?.TargetControlResized -= OnTargetControlResized;
99+
RightThumbPart?.TargetControlResized -= OnTargetControlResized;
100+
TopLeftThumbPart?.TargetControlResized -= OnTargetControlResized;
101+
TopRightThumbPart?.TargetControlResized -= OnTargetControlResized;
102+
BottomLeftThumbPart?.TargetControlResized -= OnTargetControlResized;
103+
BottomRightThumbPart?.TargetControlResized -= OnTargetControlResized;
104+
87105
TopThumbPart?.TargetControl = null;
88106
BottomThumbPart?.TargetControl = null;
89107
LeftThumbPart?.TargetControl = null;
@@ -93,4 +111,12 @@ protected override void OnDetaching()
93111
BottomLeftThumbPart?.TargetControl = null;
94112
BottomRightThumbPart?.TargetControl = null;
95113
}
114+
115+
private void OnTargetControlResized(ResizeThumb sender, TargetControlResizedEventArgs args)
116+
{
117+
// TODO: Investigate more
118+
// Note: I'm not sure why the AdornedElement's SizeChanged/LayoutUpdate isn't getting triggered by our changes...
119+
// So for now, we'll just force a layout update here of the Adorner itself to realign to the new size of the AdornedElement.
120+
this.UpdateLayout();
121+
}
96122
}

components/Adorners/src/ResizeElement/Thumb/ResizeThumb.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace CommunityToolkit.WinUI.Controls;
99
/// </summary>
1010
public partial class ResizeThumb : Control
1111
{
12+
public event TypedEventHandler<ResizeThumb, TargetControlResizedEventArgs>? TargetControlResized;
13+
1214
private Thickness? _originalMargin;
1315
private Point? _originalPosition;
1416
private Size? _originalSize;
@@ -130,6 +132,12 @@ protected override void OnManipulationDelta(ManipulationDeltaRoutedEventArgs e)
130132
newMargin.Top += verticalChange;
131133

132134
TargetControl.Margin = newMargin;
135+
136+
TargetControlResized?.Invoke(this, new TargetControlResizedEventArgs(
137+
TargetControl.Margin.Left,
138+
TargetControl.Margin.Top,
139+
TargetControl.Width,
140+
TargetControl.Height));
133141
}
134142
else
135143
{
@@ -143,7 +151,21 @@ protected override void OnManipulationDelta(ManipulationDeltaRoutedEventArgs e)
143151
if ((Direction == ResizeDirection.Top || Direction == ResizeDirection.TopLeft || Direction == ResizeDirection.TopRight)
144152
&& adjustHeight)
145153
Canvas.SetTop(TargetControl, newY);
154+
155+
TargetControlResized?.Invoke(this, new TargetControlResizedEventArgs(
156+
Canvas.GetLeft(TargetControl),
157+
Canvas.GetTop(TargetControl),
158+
TargetControl.Width,
159+
TargetControl.Height));
146160
}
147161
}
148162
}
149163
}
164+
165+
public class TargetControlResizedEventArgs(double newLeft, double newTop, double newWidth, double newHeight) : EventArgs
166+
{
167+
public double NewLeft { get; } = newLeft;
168+
public double NewTop { get; } = newTop;
169+
public double NewWidth { get; } = newWidth;
170+
public double NewHeight { get; } = newHeight;
171+
}

0 commit comments

Comments
 (0)