|
| 1 | +using System.ComponentModel; |
1 | 2 | using System.Globalization; |
2 | 3 | using System.Reflection; |
3 | 4 | using Microsoft.Extensions.Options; |
@@ -27,6 +28,7 @@ internal class MauiEventsBinder : IMauiEventsBinder |
27 | 28 | private static readonly HashSet<Type> ExplicitlyHandledTypes = new() |
28 | 29 | { |
29 | 30 | typeof(Element), |
| 31 | + typeof(VisualElement), |
30 | 32 | typeof(BindableObject), |
31 | 33 | typeof(Application), |
32 | 34 | typeof(Window), |
@@ -61,6 +63,11 @@ private void BindApplicationEvents(Application application) |
61 | 63 | // All elements have a set of common events we can hook |
62 | 64 | BindElementEvents(e.Element); |
63 | 65 |
|
| 66 | + if (e.Element is VisualElement visualElement) |
| 67 | + { |
| 68 | + BindVisualElementEvents(visualElement); |
| 69 | + } |
| 70 | + |
64 | 71 | // We'll use reflection to attach to other events |
65 | 72 | // This allows us to attach to events from custom controls |
66 | 73 | BindReflectedEvents(e.Element); |
@@ -125,6 +132,13 @@ private void BindReflectedEvents(Element element) |
125 | 132 | var events = elementType.GetEvents(BindingFlags.Instance | BindingFlags.Public); |
126 | 133 | foreach (var eventInfo in events.Where(e => !ExplicitlyHandledTypes.Contains(e.DeclaringType!))) |
127 | 134 | { |
| 135 | + var browsable = eventInfo.GetCustomAttribute<EditorBrowsableAttribute>(); |
| 136 | + if (browsable != null && browsable.State != EditorBrowsableState.Always) |
| 137 | + { |
| 138 | + // These events are not meant for typical consumption. |
| 139 | + continue; |
| 140 | + } |
| 141 | + |
128 | 142 | Action<object, object> handler = (sender, _) => |
129 | 143 | { |
130 | 144 | _hub.AddBreadcrumbForEvent(_options, sender, eventInfo.Name); |
@@ -255,6 +269,30 @@ private void BindElementEvents(Element element) |
255 | 269 | // element.PropertyChanged |
256 | 270 | } |
257 | 271 |
|
| 272 | + private void BindVisualElementEvents(VisualElement element) |
| 273 | + { |
| 274 | + element.Focused += (sender, e) => |
| 275 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.Focused), SystemType, RenderingCategory); |
| 276 | + |
| 277 | + element.Unfocused += (sender, e) => |
| 278 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.Unfocused), SystemType, RenderingCategory); |
| 279 | + |
| 280 | + element.Loaded += (sender, e) => |
| 281 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.Loaded), SystemType, RenderingCategory); |
| 282 | + |
| 283 | + element.Unloaded += (sender, e) => |
| 284 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.Unloaded), SystemType, RenderingCategory); |
| 285 | + |
| 286 | + element.ChildrenReordered += (sender, e) => |
| 287 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.ChildrenReordered), SystemType, RenderingCategory); |
| 288 | + |
| 289 | + element.MeasureInvalidated += (sender, e) => |
| 290 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.MeasureInvalidated), SystemType, RenderingCategory); |
| 291 | + |
| 292 | + element.SizeChanged += (sender, e) => |
| 293 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(VisualElement.SizeChanged), SystemType, RenderingCategory); |
| 294 | + } |
| 295 | + |
258 | 296 | private void BindShellEvents(Shell shell) |
259 | 297 | { |
260 | 298 | // Navigation events |
@@ -309,8 +347,8 @@ private void BindButtonEvents(Button button) |
309 | 347 | button.Clicked += (sender, _) => |
310 | 348 | _hub.AddBreadcrumbForEvent(_options, sender, nameof(Button.Clicked), UserType, UserActionCategory); |
311 | 349 | button.Pressed += (sender, _) => |
312 | | - _hub.AddBreadcrumbForEvent(_options, sender, nameof(Button.Pressed), UserType,UserActionCategory); |
| 350 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(Button.Pressed), UserType, UserActionCategory); |
313 | 351 | button.Released += (sender, _) => |
314 | | - _hub.AddBreadcrumbForEvent(_options, sender, nameof(Button.Released), UserType,UserActionCategory); |
| 352 | + _hub.AddBreadcrumbForEvent(_options, sender, nameof(Button.Released), UserType, UserActionCategory); |
315 | 353 | } |
316 | 354 | } |
0 commit comments