Skip to content

Commit acf30d6

Browse files
Merge pull request #4787 from michael-hawker/llama/fix4784
RadialGauge and WeakEventListener optimizations
2 parents b2ea7ba + 5ba956e commit acf30d6

File tree

8 files changed

+93
-65
lines changed

8 files changed

+93
-65
lines changed

Microsoft.Toolkit.Uwp.UI.Controls.Core/RotatorTile/RotatorTile.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ private void OnCollectionChanged(object oldValue, object newValue)
440440
var incc = (INotifyCollectionChanged)newValue;
441441
_inccWeakEventListener = new WeakEventListener<RotatorTile, object, NotifyCollectionChangedEventArgs>(this)
442442
{
443-
OnEventAction = (instance, source, eventArgs) => instance.Incc_CollectionChanged(source, eventArgs),
443+
OnEventAction = static (instance, source, eventArgs) => instance.Incc_CollectionChanged(source, eventArgs),
444444
OnDetachAction = (listener) => incc.CollectionChanged -= listener.OnEvent
445445
};
446446
incc.CollectionChanged += _inccWeakEventListener.OnEvent;

Microsoft.Toolkit.Uwp.UI.Controls.Input/RadialGauge/RadialGauge.cs

Lines changed: 81 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,80 @@ public RadialGauge()
185185

186186
SmallChange = 1;
187187
LargeChange = 10;
188-
Unloaded += RadialGauge_Unloaded;
188+
189+
// Small step
190+
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Left, static (_, kaea) =>
191+
{
192+
if (kaea.Element is RadialGauge gauge)
193+
{
194+
gauge.Value = Math.Max(gauge.Minimum, gauge.Value - Math.Max(gauge.StepSize, gauge.SmallChange));
195+
kaea.Handled = true;
196+
}
197+
});
198+
199+
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Up, static (_, kaea) =>
200+
{
201+
if (kaea.Element is RadialGauge gauge)
202+
{
203+
gauge.Value = Math.Min(gauge.Maximum, gauge.Value + Math.Max(gauge.StepSize, gauge.SmallChange));
204+
kaea.Handled = true;
205+
}
206+
});
207+
208+
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Right, static (_, kaea) =>
209+
{
210+
if (kaea.Element is RadialGauge gauge)
211+
{
212+
gauge.Value = Math.Min(gauge.Maximum, gauge.Value + Math.Max(gauge.StepSize, gauge.SmallChange));
213+
kaea.Handled = true;
214+
}
215+
});
216+
217+
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Down, static (_, kaea) =>
218+
{
219+
if (kaea.Element is RadialGauge gauge)
220+
{
221+
gauge.Value = Math.Max(gauge.Minimum, gauge.Value - Math.Max(gauge.StepSize, gauge.SmallChange));
222+
kaea.Handled = true;
223+
}
224+
});
225+
226+
// Large step
227+
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Left, static (_, kaea) =>
228+
{
229+
if (kaea.Element is RadialGauge gauge)
230+
{
231+
gauge.Value = Math.Max(gauge.Minimum, gauge.Value - Math.Max(gauge.StepSize, gauge.LargeChange));
232+
kaea.Handled = true;
233+
}
234+
});
235+
236+
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Up, static (_, kaea) =>
237+
{
238+
if (kaea.Element is RadialGauge gauge)
239+
{
240+
gauge.Value = Math.Min(gauge.Maximum, gauge.Value + Math.Max(gauge.StepSize, gauge.LargeChange));
241+
kaea.Handled = true;
242+
}
243+
});
244+
245+
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Right, static (_, kaea) =>
246+
{
247+
if (kaea.Element is RadialGauge gauge)
248+
{
249+
gauge.Value = Math.Min(gauge.Maximum, gauge.Value + Math.Max(gauge.StepSize, gauge.LargeChange));
250+
kaea.Handled = true;
251+
}
252+
});
253+
254+
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Down, static (_, kaea) =>
255+
{
256+
if (kaea.Element is RadialGauge gauge)
257+
{
258+
gauge.Value = Math.Max(gauge.Minimum, gauge.Value - Math.Max(gauge.StepSize, gauge.LargeChange));
259+
kaea.Handled = true;
260+
}
261+
});
189262
}
190263

191264
private void ThemeListener_ThemeChanged(ThemeListener sender)
@@ -195,8 +268,8 @@ private void ThemeListener_ThemeChanged(ThemeListener sender)
195268

196269
private void RadialGauge_Unloaded(object sender, RoutedEventArgs e)
197270
{
198-
// Unregister event handlers.
199-
KeyboardAccelerators.Clear();
271+
// TODO: We should just use a WeakEventListener for ThemeChanged here, but ours currently doesn't support it.
272+
// See proposal for general helper here: https://github.com/CommunityToolkit/dotnet/issues/404
200273
ThemeListener.ThemeChanged -= ThemeListener_ThemeChanged;
201274
PointerReleased -= RadialGauge_PointerReleased;
202275
Unloaded -= RadialGauge_Unloaded;
@@ -407,6 +480,10 @@ protected override AutomationPeer OnCreateAutomationPeer()
407480
/// </summary>
408481
protected override void OnApplyTemplate()
409482
{
483+
PointerReleased -= RadialGauge_PointerReleased;
484+
ThemeListener.ThemeChanged -= ThemeListener_ThemeChanged;
485+
Unloaded -= RadialGauge_Unloaded;
486+
410487
// Remember local brushes.
411488
_needleBrush = ReadLocalValue(NeedleBrushProperty) as SolidColorBrush;
412489
_trailBrush = ReadLocalValue(TrailBrushProperty) as SolidColorBrush;
@@ -415,58 +492,9 @@ protected override void OnApplyTemplate()
415492
_tickBrush = ReadLocalValue(TickBrushProperty) as SolidColorBrush;
416493
_foreground = ReadLocalValue(ForegroundProperty) as SolidColorBrush;
417494

418-
// Small step
419-
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Left, (_, kaea) =>
420-
{
421-
Value = Math.Max(Minimum, Value - Math.Max(StepSize, SmallChange));
422-
kaea.Handled = true;
423-
});
424-
425-
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Up, (_, kaea) =>
426-
{
427-
Value = Math.Min(Maximum, Value + Math.Max(StepSize, SmallChange));
428-
kaea.Handled = true;
429-
});
430-
431-
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Right, (_, kaea) =>
432-
{
433-
Value = Math.Min(Maximum, Value + Math.Max(StepSize, SmallChange));
434-
kaea.Handled = true;
435-
});
436-
437-
AddKeyboardAccelerator(VirtualKeyModifiers.None, VirtualKey.Down, (_, kaea) =>
438-
{
439-
Value = Math.Max(Minimum, Value - Math.Max(StepSize, SmallChange));
440-
kaea.Handled = true;
441-
});
442-
443-
// Large step
444-
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Left, (_, kaea) =>
445-
{
446-
Value = Math.Max(Minimum, Value - Math.Max(StepSize, LargeChange));
447-
kaea.Handled = true;
448-
});
449-
450-
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Up, (_, kaea) =>
451-
{
452-
Value = Math.Min(Maximum, Value + Math.Max(StepSize, LargeChange));
453-
kaea.Handled = true;
454-
});
455-
456-
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Right, (_, kaea) =>
457-
{
458-
Value = Math.Min(Maximum, Value + Math.Max(StepSize, LargeChange));
459-
kaea.Handled = true;
460-
});
461-
462-
AddKeyboardAccelerator(VirtualKeyModifiers.Control, VirtualKey.Down, (_, kaea) =>
463-
{
464-
Value = Math.Max(Minimum, Value - Math.Max(StepSize, LargeChange));
465-
kaea.Handled = true;
466-
});
467-
468495
PointerReleased += RadialGauge_PointerReleased;
469496
ThemeListener.ThemeChanged += ThemeListener_ThemeChanged;
497+
Unloaded += RadialGauge_Unloaded;
470498

471499
// Apply color scheme.
472500
OnColorsChanged();

Microsoft.Toolkit.Uwp.UI.Controls.Input/TokenizingTextBox/InterspersedObservableCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public InterspersedObservableCollection(object itemsSource)
6262
{
6363
var weakPropertyChangedListener = new WeakEventListener<InterspersedObservableCollection, object, NotifyCollectionChangedEventArgs>(this)
6464
{
65-
OnEventAction = (instance, source, eventArgs) => instance.ItemsSource_CollectionChanged(source, eventArgs),
65+
OnEventAction = static (instance, source, eventArgs) => instance.ItemsSource_CollectionChanged(source, eventArgs),
6666
OnDetachAction = (weakEventListener) => notifier.CollectionChanged -= weakEventListener.OnEvent // Use Local Reference Only
6767
};
6868
notifier.CollectionChanged += weakPropertyChangedListener.OnEvent;

Microsoft.Toolkit.Uwp.UI/AdvancedCollectionView/AdvancedCollectionView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public IList Source
9797
new WeakEventListener<AdvancedCollectionView, object, NotifyCollectionChangedEventArgs>(this)
9898
{
9999
// Call the actual collection changed event
100-
OnEventAction = (source, changed, arg3) => SourceNcc_CollectionChanged(source, arg3),
100+
OnEventAction = static (instance, source, arg3) => instance.SourceNcc_CollectionChanged(source, arg3),
101101

102102
// The source doesn't exist anymore
103103
OnDetachAction = (listener) => sourceNcc.CollectionChanged -= _sourceWeakEventListener.OnEvent

Microsoft.Toolkit.Uwp.UI/Triggers/FullScreenModeStateTrigger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public FullScreenModeStateTrigger()
2323
var weakEvent =
2424
new WeakEventListener<FullScreenModeStateTrigger, ApplicationView, object>(this)
2525
{
26-
OnEventAction = (instance, source, eventArgs) => instance.FullScreenModeTrigger_VisibleBoundsChanged(source, eventArgs),
26+
OnEventAction = static (instance, source, eventArgs) => instance.FullScreenModeTrigger_VisibleBoundsChanged(source, eventArgs),
2727
OnDetachAction = (weakEventListener) => ApplicationView.GetForCurrentView().VisibleBoundsChanged -= weakEventListener.OnEvent
2828
};
2929
ApplicationView.GetForCurrentView().VisibleBoundsChanged += weakEvent.OnEvent;

Microsoft.Toolkit.Uwp.UI/Triggers/IsNullOrEmptyStateTrigger.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ private static void OnValuePropertyChanged(DependencyObject d, DependencyPropert
4747
var valNotifyCollection = val as INotifyCollectionChanged;
4848
if (valNotifyCollection != null)
4949
{
50-
var weakEvent = new WeakEventListener<INotifyCollectionChanged, object, NotifyCollectionChangedEventArgs>(valNotifyCollection)
50+
var weakEvent = new WeakEventListener<IsNullOrEmptyStateTrigger, object, NotifyCollectionChangedEventArgs>(obj)
5151
{
52-
OnEventAction = (instance, source, args) => obj.SetActive(IsNullOrEmpty(instance)),
52+
OnEventAction = static (instance, source, args) => instance.SetActive(IsNullOrEmpty(source)),
5353
OnDetachAction = (weakEventListener) => valNotifyCollection.CollectionChanged -= weakEventListener.OnEvent
5454
};
5555

@@ -61,9 +61,9 @@ private static void OnValuePropertyChanged(DependencyObject d, DependencyPropert
6161
var valObservableVector = val as IObservableVector<object>;
6262
if (valObservableVector != null)
6363
{
64-
var weakEvent = new WeakEventListener<IObservableVector<object>, object, IVectorChangedEventArgs>(valObservableVector)
64+
var weakEvent = new WeakEventListener<IsNullOrEmptyStateTrigger, object, IVectorChangedEventArgs>(obj)
6565
{
66-
OnEventAction = (instance, source, args) => obj.SetActive(IsNullOrEmpty(instance)),
66+
OnEventAction = static (instance, source, args) => instance.SetActive(IsNullOrEmpty(source)),
6767
OnDetachAction = (weakEventListener) => valObservableVector.VectorChanged -= weakEventListener.OnEvent
6868
};
6969

@@ -75,9 +75,9 @@ private static void OnValuePropertyChanged(DependencyObject d, DependencyPropert
7575
var valObservableMap = val as IObservableMap<object, object>;
7676
if (valObservableMap != null)
7777
{
78-
var weakEvent = new WeakEventListener<IObservableMap<object, object>, object, IMapChangedEventArgs<object>>(valObservableMap)
78+
var weakEvent = new WeakEventListener<IsNullOrEmptyStateTrigger, object, IMapChangedEventArgs<object>>(obj)
7979
{
80-
OnEventAction = (instance, source, args) => obj.SetActive(IsNullOrEmpty(instance)),
80+
OnEventAction = static (instance, source, args) => instance.SetActive(IsNullOrEmpty(source)),
8181
OnDetachAction = (weakEventListener) => valObservableMap.MapChanged -= weakEventListener.OnEvent
8282
};
8383

Microsoft.Toolkit.Uwp.UI/Triggers/NetworkConnectionStateTrigger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public NetworkConnectionStateTrigger()
2525
var weakEvent =
2626
new WeakEventListener<NetworkConnectionStateTrigger, object>(this)
2727
{
28-
OnEventAction = (instance, source) => NetworkInformation_NetworkStatusChanged(source),
28+
OnEventAction = static (instance, source) => instance.NetworkInformation_NetworkStatusChanged(source),
2929
OnDetachAction = (weakEventListener) => NetworkInformation.NetworkStatusChanged -= weakEventListener.OnEvent
3030
};
3131
NetworkInformation.NetworkStatusChanged += weakEvent.OnEvent;

Microsoft.Toolkit.Uwp.UI/Triggers/UserInteractionModeStateTrigger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public UserInteractionModeStateTrigger()
2424
var weakEvent =
2525
new WeakEventListener<UserInteractionModeStateTrigger, object, WindowSizeChangedEventArgs>(this)
2626
{
27-
OnEventAction = (instance, source, eventArgs) => UserInteractionModeTrigger_SizeChanged(source, eventArgs),
27+
OnEventAction = static (instance, source, eventArgs) => instance.UserInteractionModeTrigger_SizeChanged(source, eventArgs),
2828
OnDetachAction = (weakEventListener) => Window.Current.SizeChanged -= weakEventListener.OnEvent
2929
};
3030
Window.Current.SizeChanged += weakEvent.OnEvent;

0 commit comments

Comments
 (0)