Skip to main content

ferroui_base/markup_types/
classes.rs

1// @generated by scripts/generate_markup_types.py — do not edit
2//! The `markup` part of the classes of the object model of this crate:
3//! what markup needs to know about each class beyond its registered
4//! properties (content property, plain properties, constructors with
5//! arguments, methods, routed events as static values, plain events,
6//! attributes of the type and of its registered properties), as the managed
7//! original declares it. The hand-written members come from
8//! `scripts/markup_types_overrides.py`.
9//!
10//! A plain event lists the parameters of the handler of the managed
11//! original: nothing for an event without arguments, the sender and the
12//! arguments otherwise (the adapter passes the instance as the sender).
13
14// Obsolete members of the managed original are declared too (with `[Obsolete]`).
15#![allow(deprecated)]
16
17use super::plain::{new_resource_key, property_value};
18use crate::animation::*;
19use crate::collections::*;
20use crate::controls::*;
21use crate::data::core::ValueTypes;
22use crate::data::{BindingBase, BindingExpressionBase, BindingPriority};
23use crate::input::gesture_recognizers::*;
24use crate::input::text_input::*;
25use crate::input::*;
26use crate::interactivity::*;
27use crate::layout::*;
28use crate::logical_tree::*;
29use crate::media::effects::*;
30use crate::media::imaging::*;
31use crate::media::*;
32use crate::ferro_class_info;
33use crate::metadata::{into_markup_value, MarkupDelegate, MarkupType};
34use crate::reactive::IDisposable;
35use crate::styling::*;
36use crate::utilities::EventArgs;
37use crate::*;
38use std::rc::Rc;
39use crate::ferro_markup_type;
40use crate::metadata::MarkupTyped;
41
42// FerroUI
43
44ferro_class_info!(FerroObject {
45    markup: {
46        namespace: "FerroUI",
47        methods: [
48            fn Bind(&'static FerroProperty, Rc<dyn BindingBase>) -> Rc<dyn BindingExpressionBase> =>
49                |this: &Ref<FerroObject>, property: &'static FerroProperty, binding: Rc<dyn BindingBase>| {
50                    this.bind_binding(property, &*binding)
51                },
52            try fn SetValue(&'static FerroProperty, Option<BoxedValue>, BindingPriority) -> Option<Rc<dyn IDisposable>> =>
53                |this: &Ref<FerroObject>, property: &'static FerroProperty, value: Option<BoxedValue>, priority: BindingPriority| {
54                    // The value is set as a value of the type of the property.
55                    property_value(property, value).map(|value| this.set_value_untyped(property, value.as_any(), priority))
56                },
57        ],
58        events: [
59            // The arguments borrow the values of the change: the handler receives them held by value.
60            PropertyChanged(Option<BoxedValue>, OwnedFerroPropertyChangedEventArgs) => |this: &Ref<FerroObject>, handler: MarkupDelegate| {
61                let sender = this.downgrade();
62                this.property_changed(move |e: &FerroPropertyChangedEventArgs<'_>| {
63                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.to_owned_args())]);
64                })
65            },
66        ],
67    },
68});
69
70ferro_class_info!(StyledElement {
71    markup: {
72        namespace: "FerroUI",
73        properties: [
74            Classes: Classes { get: StyledElement::classes },
75            Styles: Ref<Styles> { get: StyledElement::styles },
76            Resources: Rc<dyn IResourceDictionary> {
77                get: |this: &Ref<StyledElement>| -> Rc<dyn IResourceDictionary> { this.resources().into() },
78                try_set: |this: &Ref<StyledElement>, value: Rc<dyn IResourceDictionary>| {
79                    match value.as_object().and_then(|object| object.to_ref().cast::<ResourceDictionary>()) {
80                        Some(dictionary) => Ok(this.set_resources(dictionary)),
81                        None => Err("The resource dictionary is not a ResourceDictionary."),
82                    }
83                }
84            },
85        ],
86        events: [
87            AttachedToLogicalTree(Option<BoxedValue>, LogicalTreeAttachmentEventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
88                let sender = this.downgrade();
89                this.attached_to_logical_tree(move |e: &LogicalTreeAttachmentEventArgs| {
90                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
91                })
92            },
93            DetachedFromLogicalTree(Option<BoxedValue>, LogicalTreeAttachmentEventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
94                let sender = this.downgrade();
95                this.detached_from_logical_tree(move |e: &LogicalTreeAttachmentEventArgs| {
96                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
97                })
98            },
99            DataContextChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
100                let sender = this.downgrade();
101                this.data_context_changed(move || {
102                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
103                })
104            },
105            Initialized(Option<BoxedValue>, EventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
106                let sender = this.downgrade();
107                this.initialized(move || {
108                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
109                })
110            },
111            ResourcesChanged(Option<BoxedValue>, ResourcesChangedEventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
112                let sender = this.downgrade();
113                this.resources_changed(move |e: &ResourcesChangedEventArgs| {
114                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
115                })
116            },
117            ActualThemeVariantChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<StyledElement>, handler: MarkupDelegate| {
118                let sender = this.downgrade();
119                this.actual_theme_variant_changed(move || {
120                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
121                })
122            },
123        ],
124    },
125});
126
127ferro_class_info!(Visual {
128    markup: {
129        namespace: "FerroUI",
130        properties: [
131            FlowDirection: FlowDirection {
132                get: |this: &Ref<Visual>| this.get_value(Visual::flow_direction_property()),
133                set: |this: &Ref<Visual>, value: FlowDirection| this.set_value(Visual::flow_direction_property(), value)
134            },
135        ],
136        events: [
137            AttachedToVisualTree(Option<BoxedValue>, VisualTreeAttachmentEventArgs) => |this: &Ref<Visual>, handler: MarkupDelegate| {
138                let sender = this.downgrade();
139                this.attached_to_visual_tree(move |e: &VisualTreeAttachmentEventArgs| {
140                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
141                })
142            },
143            DetachedFromVisualTree(Option<BoxedValue>, VisualTreeAttachmentEventArgs) => |this: &Ref<Visual>, handler: MarkupDelegate| {
144                let sender = this.downgrade();
145                this.detached_from_visual_tree(move |e: &VisualTreeAttachmentEventArgs| {
146                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
147                })
148            },
149        ],
150        attributes: [UsableDuringInitialization],
151    },
152});
153
154// FerroUI.Animation
155
156ferro_class_info!(Animation {
157    markup: {
158        namespace: "FerroUI.Animation",
159        content: Children,
160        properties: [
161            Children: KeyFrames { get: Animation::children },
162        ],
163        methods: [
164            static fn SetAnimator(Rc<dyn IAnimationSetter>, Rc<dyn ICustomAnimator>) =>
165            |setter: Rc<dyn IAnimationSetter>, value: Rc<dyn ICustomAnimator>| Animation::set_animator(&setter, value),
166        ],
167    },
168});
169
170ferro_class_info!(AnimatorKeyFrame {
171    markup: {
172        namespace: "FerroUI.Animation",
173        properties: [
174            FillBefore: bool { get: AnimatorKeyFrame::fill_before, set: AnimatorKeyFrame::set_fill_before },
175            FillAfter: bool { get: AnimatorKeyFrame::fill_after, set: AnimatorKeyFrame::set_fill_after },
176        ],
177    },
178});
179
180ferro_class_info!(KeyFrame {
181    markup: {
182        namespace: "FerroUI.Animation",
183        content: Setters,
184        properties: [
185            Setters: FerroList<Rc<dyn IAnimationSetter>> { get: KeyFrame::setters },
186            KeyTime: TimeSpan { get: KeyFrame::key_time, set: KeyFrame::set_key_time },
187            Cue: Cue { get: KeyFrame::cue, set: KeyFrame::set_cue },
188            KeySpline: Option<Ref<KeySpline>> { get: KeyFrame::key_spline, set: KeyFrame::set_key_spline },
189        ],
190    },
191});
192
193ferro_class_info!(KeySpline {
194    markup: {
195        namespace: "FerroUI.Animation",
196        parse: KeySpline::parse,
197        constructors: [
198            (f64, f64, f64, f64) => KeySpline::with_points,
199        ],
200        properties: [
201            ControlPointX1: f64 { get: KeySpline::control_point_x1, set: KeySpline::set_control_point_x1 },
202            ControlPointY1: f64 { get: KeySpline::control_point_y1, set: KeySpline::set_control_point_y1 },
203            ControlPointX2: f64 { get: KeySpline::control_point_x2, set: KeySpline::set_control_point_x2 },
204            ControlPointY2: f64 { get: KeySpline::control_point_y2, set: KeySpline::set_control_point_y2 },
205        ],
206    },
207});
208
209// FerroUI.Controls
210
211ferro_markup_type!(static NameScope {
212    namespace: "FerroUI.Controls",
213    type_info: NameScope,
214    methods: [
215        static fn GetNameScope(Ref<StyledElement>) -> Option<NameScopeRef> =>
216            |styled: Ref<StyledElement>| NameScope::get_name_scope(&styled),
217        static fn SetNameScope(Ref<StyledElement>, Option<NameScopeRef>) =>
218            |styled: Ref<StyledElement>, scope: Option<NameScopeRef>| NameScope::set_name_scope(&styled, scope),
219    ],
220});
221
222// The key of a resource is any object in the managed original; `resource_key` converts the kinds of key the
223// port has.
224ferro_class_info!(ResourceDictionary {
225    markup: {
226        namespace: "FerroUI.Controls",
227        properties: [
228            Count: i32 { get: |this: &Ref<ResourceDictionary>| this.count() as i32 },
229            MergedDictionaries: FerroList<Rc<dyn IResourceProvider>> { get: ResourceDictionary::merged_dictionaries },
230            ThemeDictionaries: FerroDictionary<ThemeVariant, Rc<dyn IThemeVariantProvider>> { get: ResourceDictionary::theme_dictionaries },
231        ],
232        methods: [
233            try fn Add(Option<BoxedValue>, Option<BoxedValue>) =>
234                |this: &Ref<ResourceDictionary>, key: Option<BoxedValue>, value: Option<BoxedValue>| {
235                    new_resource_key(this, key).map(|key| this.add(key, value))
236                },
237            try fn AddDeferred(Option<BoxedValue>, Rc<dyn IDeferredContent>) =>
238                |this: &Ref<ResourceDictionary>, key: Option<BoxedValue>, content: Rc<dyn IDeferredContent>| {
239                    new_resource_key(this, key).map(|key| this.add_deferred(key, content))
240                },
241            try fn AddNotSharedDeferred(Option<BoxedValue>, Rc<dyn IDeferredContent>) =>
242                |this: &Ref<ResourceDictionary>, key: Option<BoxedValue>, content: Rc<dyn IDeferredContent>| {
243                    new_resource_key(this, key).map(|key| this.add_not_shared_deferred(key, content))
244                },
245            fn EnsureCapacity(i32) =>
246                |this: &Ref<ResourceDictionary>, capacity: i32| this.ensure_capacity(capacity.max(0) as usize),
247        ],
248    },
249});
250
251ferro_class_info!(ResourceProvider {
252    markup: {
253        namespace: "FerroUI.Controls",
254        events: [
255            OwnerChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<ResourceProvider>, handler: MarkupDelegate| {
256                let sender = this.downgrade();
257                this.owner_changed(move || {
258                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
259                })
260            },
261        ],
262    },
263});
264
265// FerroUI.Input
266
267ferro_markup_type!(static AccessKeyHandler {
268    namespace: "FerroUI.Input",
269    type_info: AccessKeyHandler,
270    fields: [
271        AccessKeyEvent: RoutedEvent<AccessKeyEventArgs> => || *AccessKeyHandler::access_key_event(),
272        AccessKeyPressedEvent: RoutedEvent<AccessKeyPressedEventArgs> => || *AccessKeyHandler::access_key_pressed_event(),
273    ],
274});
275
276ferro_markup_type!(static DragDrop {
277    namespace: "FerroUI.Input",
278    type_info: DragDrop,
279    fields: [
280        DragEnterEvent: RoutedEvent<DragEventArgs> => || *DragDrop::drag_enter_event(),
281        DragLeaveEvent: RoutedEvent<DragEventArgs> => || *DragDrop::drag_leave_event(),
282        DragOverEvent: RoutedEvent<DragEventArgs> => || *DragDrop::drag_over_event(),
283        DropEvent: RoutedEvent<DragEventArgs> => || *DragDrop::drop_event(),
284    ],
285});
286
287ferro_class_info!(InputElement {
288    markup: {
289        namespace: "FerroUI.Input",
290        properties: [
291            KeyBindings: FerroList<Ref<KeyBinding>> { get: InputElement::key_bindings },
292            GestureRecognizers: GestureRecognizerCollection { get: InputElement::gesture_recognizers },
293        ],
294        fields: [
295            PinchEvent: RoutedEvent<PinchEventArgs> => || *InputElement::pinch_event(),
296            PinchEndedEvent: RoutedEvent<PinchEndedEventArgs> => || *InputElement::pinch_ended_event(),
297            PullGestureEvent: RoutedEvent<PullGestureEventArgs> => || *InputElement::pull_gesture_event(),
298            PullGestureEndedEvent: RoutedEvent<PullGestureEndedEventArgs> => || *InputElement::pull_gesture_ended_event(),
299            SwipeGestureEvent: RoutedEvent<SwipeGestureEventArgs> => || *InputElement::swipe_gesture_event(),
300            SwipeGestureEndedEvent: RoutedEvent<SwipeGestureEndedEventArgs> => || *InputElement::swipe_gesture_ended_event(),
301            ScrollGestureEvent: RoutedEvent<ScrollGestureEventArgs> => || *InputElement::scroll_gesture_event(),
302            ScrollGestureInertiaStartingEvent: RoutedEvent<ScrollGestureInertiaStartingEventArgs> => || *InputElement::scroll_gesture_inertia_starting_event(),
303            ScrollGestureEndedEvent: RoutedEvent<ScrollGestureEndedEventArgs> => || *InputElement::scroll_gesture_ended_event(),
304            PointerTouchPadGestureMagnifyEvent: RoutedEvent<PointerDeltaEventArgs> => || *InputElement::pointer_touch_pad_gesture_magnify_event(),
305            PointerTouchPadGestureRotateEvent: RoutedEvent<PointerDeltaEventArgs> => || *InputElement::pointer_touch_pad_gesture_rotate_event(),
306            PointerTouchPadGestureSwipeEvent: RoutedEvent<PointerDeltaEventArgs> => || *InputElement::pointer_touch_pad_gesture_swipe_event(),
307            TappedEvent: RoutedEvent<TappedEventArgs> => || *InputElement::tapped_event(),
308            RightTappedEvent: RoutedEvent<TappedEventArgs> => || *InputElement::right_tapped_event(),
309            HoldingEvent: RoutedEvent<HoldingRoutedEventArgs> => || *InputElement::holding_event(),
310            DoubleTappedEvent: RoutedEvent<TappedEventArgs> => || *InputElement::double_tapped_event(),
311            GotFocusEvent: RoutedEvent<FocusChangedEventArgs> => || *InputElement::got_focus_event(),
312            GettingFocusEvent: RoutedEvent<FocusChangingEventArgs> => || *InputElement::getting_focus_event(),
313            LostFocusEvent: RoutedEvent<FocusChangedEventArgs> => || *InputElement::lost_focus_event(),
314            LosingFocusEvent: RoutedEvent<FocusChangingEventArgs> => || *InputElement::losing_focus_event(),
315            KeyDownEvent: RoutedEvent<KeyEventArgs> => || *InputElement::key_down_event(),
316            KeyUpEvent: RoutedEvent<KeyEventArgs> => || *InputElement::key_up_event(),
317            TextInputEvent: RoutedEvent<TextInputEventArgs> => || *InputElement::text_input_event(),
318            TextInputMethodClientRequestedEvent: RoutedEvent<TextInputMethodClientRequestedEventArgs> => || *InputElement::text_input_method_client_requested_event(),
319            PointerEnteredEvent: RoutedEvent<PointerEventArgs> => || *InputElement::pointer_entered_event(),
320            PointerExitedEvent: RoutedEvent<PointerEventArgs> => || *InputElement::pointer_exited_event(),
321            PointerMovedEvent: RoutedEvent<PointerEventArgs> => || *InputElement::pointer_moved_event(),
322            PointerPressedEvent: RoutedEvent<PointerPressedEventArgs> => || *InputElement::pointer_pressed_event(),
323            PointerReleasedEvent: RoutedEvent<PointerReleasedEventArgs> => || *InputElement::pointer_released_event(),
324            PointerCaptureLostEvent: RoutedEvent<PointerCaptureLostEventArgs> => || *InputElement::pointer_capture_lost_event(),
325            PointerWheelChangedEvent: RoutedEvent<PointerWheelEventArgs> => || *InputElement::pointer_wheel_changed_event(),
326            ContextRequestedEvent: RoutedEvent<ContextRequestedEventArgs> => || *InputElement::context_requested_event(),
327            ContextCanceledEvent: RoutedEvent<RoutedEventArgs> => || *InputElement::context_canceled_event(),
328        ],
329        attributes: [PseudoClasses(":disabled", ":focus", ":focus-visible", ":focus-within", ":pointerover")],
330    },
331});
332
333ferro_markup_type!(static InputMethod {
334    namespace: "FerroUI.Input",
335    type_info: InputMethod,
336    fields: [
337        TextInputMethodClientRequeryRequestedEvent: RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs> => || *InputMethod::text_input_method_client_requery_requested_event(),
338    ],
339});
340
341// FerroUI.Input.GestureRecognizers
342
343ferro_class_info!(PullGestureRecognizer {
344    markup: {
345        namespace: "FerroUI.Input.GestureRecognizers",
346        constructors: [
347            (PullDirection) => PullGestureRecognizer::with_direction,
348        ],
349    },
350});
351
352// FerroUI.Layout
353
354ferro_class_info!(Layoutable {
355    markup: {
356        namespace: "FerroUI.Layout",
357        events: [
358            EffectiveViewportChanged(Option<BoxedValue>, EffectiveViewportChangedEventArgs) => |this: &Ref<Layoutable>, handler: MarkupDelegate| {
359                let sender = this.downgrade();
360                this.effective_viewport_changed(move |e: &EffectiveViewportChangedEventArgs| {
361                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
362                })
363            },
364            LayoutUpdated(Option<BoxedValue>, EventArgs) => |this: &Ref<Layoutable>, handler: MarkupDelegate| {
365                let sender = this.downgrade();
366                this.layout_updated(move || {
367                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
368                })
369            },
370        ],
371    },
372});
373
374// FerroUI.Media
375
376ferro_class_info!(CacheMode {
377    markup: {
378        namespace: "FerroUI.Media",
379        parse: CacheMode::parse,
380    },
381});
382
383ferro_class_info!(CombinedGeometry {
384    markup: {
385        namespace: "FerroUI.Media",
386        constructors: [
387            (Ref<Geometry>, Ref<Geometry>) => CombinedGeometry::with_geometries,
388            (GeometryCombineMode, Option<Ref<Geometry>>, Option<Ref<Geometry>>) => CombinedGeometry::with_mode,
389            (GeometryCombineMode, Option<Ref<Geometry>>, Option<Ref<Geometry>>, Option<Ref<Transform>>) =>
390                |mode: GeometryCombineMode, a: Option<Ref<Geometry>>, b: Option<Ref<Geometry>>, t: Option<Ref<Transform>>| {
391                    CombinedGeometry::with_mode_and_transform(mode, a, b, t)
392                },
393        ],
394    },
395});
396
397ferro_class_info!(DashStyle {
398    markup: {
399        namespace: "FerroUI.Media",
400        constructors: [
401            (Option<MediaCollection<f64>>, f64) => |dashes: Option<MediaCollection<f64>>, offset: f64| {
402                DashStyle::with_dash_list(dashes.unwrap_or_default(), offset)
403            },
404        ],
405        static_properties: [
406            Dash: Rc<dyn IDashStyle> { get: || -> Rc<dyn IDashStyle> { DashStyle::dash() } },
407            Dot: Rc<dyn IDashStyle> { get: || -> Rc<dyn IDashStyle> { DashStyle::dot() } },
408            DashDot: Rc<dyn IDashStyle> { get: || -> Rc<dyn IDashStyle> { DashStyle::dash_dot() } },
409            DashDotDot: Rc<dyn IDashStyle> { get: || -> Rc<dyn IDashStyle> { DashStyle::dash_dot_dot() } },
410        ],
411    },
412});
413
414ferro_class_info!(DrawingBrush {
415    markup: {
416        namespace: "FerroUI.Media",
417        constructors: [
418            (Ref<Drawing>) => |drawing: Ref<Drawing>| DrawingBrush::with_drawing(drawing),
419        ],
420    },
421});
422
423ferro_class_info!(DrawingGroup {
424    markup: {
425        namespace: "FerroUI.Media",
426        content: Children,
427    },
428});
429
430ferro_class_info!(DrawingImage {
431    markup: {
432        namespace: "FerroUI.Media",
433        content: Drawing,
434        constructors: [
435            (Ref<Drawing>) => |drawing: Ref<Drawing>| DrawingImage::with_drawing(drawing),
436        ],
437        events: [
438            Invalidated(Option<BoxedValue>, EventArgs) => |this: &Ref<DrawingImage>, handler: MarkupDelegate| {
439                let sender = this.downgrade();
440                this.invalidated(move || {
441                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
442                })
443            },
444        ],
445    },
446});
447
448ferro_class_info!(Effect {
449    markup: {
450        namespace: "FerroUI.Media",
451        events: [
452            Invalidated(Option<BoxedValue>, EventArgs) => |this: &Ref<Effect>, handler: MarkupDelegate| {
453                let sender = this.downgrade();
454                this.invalidated(move || {
455                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
456                })
457            },
458        ],
459    },
460});
461
462ferro_class_info!(EllipseGeometry {
463    markup: {
464        namespace: "FerroUI.Media",
465        constructors: [
466            (Rect) => EllipseGeometry::with_rect,
467        ],
468    },
469});
470
471ferro_class_info!(ExperimentalAcrylicMaterial {
472    markup: {
473        namespace: "FerroUI.Media",
474        events: [
475            Invalidated(Option<BoxedValue>, EventArgs) => |this: &Ref<ExperimentalAcrylicMaterial>, handler: MarkupDelegate| {
476                let sender = this.downgrade();
477                this.invalidated(move || {
478                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
479                })
480            },
481        ],
482    },
483});
484
485ferro_class_info!(Geometry {
486    markup: {
487        namespace: "FerroUI.Media",
488        parse: Geometry::parse,
489        events: [
490            Changed(Option<BoxedValue>, EventArgs) => |this: &Ref<Geometry>, handler: MarkupDelegate| {
491                let sender = this.downgrade();
492                this.changed(move || {
493                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
494                })
495            },
496        ],
497    },
498});
499
500ferro_class_info!(GeometryDrawing {
501    markup: {
502        namespace: "FerroUI.Media",
503        content: Geometry,
504    },
505});
506
507ferro_class_info!(GeometryGroup {
508    markup: {
509        namespace: "FerroUI.Media",
510        content: Children,
511    },
512});
513
514ferro_class_info!(GradientBrush {
515    markup: {
516        namespace: "FerroUI.Media",
517        content: GradientStops,
518    },
519});
520
521ferro_class_info!(GradientStop {
522    markup: {
523        namespace: "FerroUI.Media",
524        constructors: [
525            (Color, f64) => GradientStop::with_color_and_offset,
526        ],
527    },
528});
529
530ferro_class_info!(ImageBrush {
531    markup: {
532        namespace: "FerroUI.Media",
533        constructors: [
534            (Option<Rc<dyn IImageBrushSource>>) => ImageBrush::with_source,
535        ],
536    },
537});
538
539ferro_class_info!(LineGeometry {
540    markup: {
541        namespace: "FerroUI.Media",
542        constructors: [
543            (Point, Point) => LineGeometry::with_points,
544        ],
545    },
546});
547
548ferro_class_info!(MatrixTransform {
549    markup: {
550        namespace: "FerroUI.Media",
551        constructors: [
552            (Matrix) => MatrixTransform::with_matrix,
553        ],
554    },
555});
556
557ferro_class_info!(PathFigure {
558    markup: {
559        namespace: "FerroUI.Media",
560        content: Segments,
561    },
562});
563
564ferro_class_info!(PathGeometry {
565    markup: {
566        namespace: "FerroUI.Media",
567        content: Figures,
568        parse: PathGeometry::parse,
569    },
570});
571
572ferro_class_info!(Pen {
573    markup: {
574        namespace: "FerroUI.Media",
575        constructors: [
576            (Option<Rc<dyn IBrush>>, f64, Option<Rc<dyn IDashStyle>>, PenLineCap, PenLineJoin, f64) => Pen::with_all,
577        ],
578    },
579});
580
581ferro_class_info!(PolyBezierSegment {
582    markup: {
583        namespace: "FerroUI.Media",
584        content: Points,
585        constructors: [
586            (Points, bool) => |points: Points, is_stroked: bool| PolyBezierSegment::with_points(points.iter(), is_stroked),
587        ],
588    },
589});
590
591ferro_class_info!(PolyLineSegment {
592    markup: {
593        namespace: "FerroUI.Media",
594        constructors: [
595            (Points) => |points: Points| PolyLineSegment::with_points(points.iter()),
596        ],
597    },
598});
599
600ferro_class_info!(PolylineGeometry {
601    markup: {
602        namespace: "FerroUI.Media",
603        content: Points,
604        constructors: [
605            (Points, bool) => |points: Points, is_filled: bool| PolylineGeometry::with_points(points.iter(), is_filled),
606            (Points, bool, FillRule) => |points: Points, is_filled: bool, fill_rule: FillRule| {
607                PolylineGeometry::with_points_and_fill_rule(points.iter(), is_filled, fill_rule)
608            },
609        ],
610    },
611});
612
613ferro_class_info!(RectangleGeometry {
614    markup: {
615        namespace: "FerroUI.Media",
616        constructors: [
617            (Rect) => RectangleGeometry::with_rect,
618            (Rect, f64, f64) => RectangleGeometry::with_rect_and_radii,
619        ],
620    },
621});
622
623ferro_class_info!(Rotate3DTransform {
624    markup: {
625        namespace: "FerroUI.Media",
626        constructors: [
627            (f64, f64, f64, f64, f64, f64, f64) => Rotate3DTransform::with_values,
628        ],
629    },
630});
631
632ferro_class_info!(RotateTransform {
633    markup: {
634        namespace: "FerroUI.Media",
635        constructors: [
636            (f64) => RotateTransform::with_angle,
637            (f64, f64, f64) => RotateTransform::with_angle_and_center,
638        ],
639    },
640});
641
642ferro_class_info!(ScaleTransform {
643    markup: {
644        namespace: "FerroUI.Media",
645        constructors: [
646            (f64, f64) => ScaleTransform::with_scale,
647        ],
648    },
649});
650
651ferro_class_info!(SkewTransform {
652    markup: {
653        namespace: "FerroUI.Media",
654        constructors: [
655            (f64, f64) => SkewTransform::with_angles,
656        ],
657    },
658});
659
660ferro_class_info!(SolidColorBrush {
661    markup: {
662        namespace: "FerroUI.Media",
663        constructors: [
664            (Color) => SolidColorBrush::with_color,
665            (Color, f64) => SolidColorBrush::with_color_and_opacity,
666            (u32) => SolidColorBrush::from_uint32,
667        ],
668    },
669});
670
671ferro_class_info!(StreamGeometry {
672    markup: {
673        namespace: "FerroUI.Media",
674        parse: StreamGeometry::parse,
675    },
676});
677
678ferro_class_info!(Transform {
679    markup: {
680        namespace: "FerroUI.Media",
681        parse: Transform::parse,
682        events: [
683            Changed(Option<BoxedValue>, EventArgs) => |this: &Ref<Transform>, handler: MarkupDelegate| {
684                let sender = this.downgrade();
685                this.changed(move || {
686                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
687                })
688            },
689        ],
690    },
691});
692
693ferro_class_info!(TransformGroup {
694    markup: {
695        namespace: "FerroUI.Media",
696        content: Children,
697    },
698});
699
700ferro_class_info!(TranslateTransform {
701    markup: {
702        namespace: "FerroUI.Media",
703        constructors: [
704            (f64, f64) => TranslateTransform::with_offset,
705        ],
706    },
707});
708
709ferro_class_info!(VisualBrush {
710    markup: {
711        namespace: "FerroUI.Media",
712        constructors: [
713            (Ref<Visual>) => |visual: Ref<Visual>| VisualBrush::with_visual(visual),
714        ],
715    },
716});
717
718// FerroUI.Media.Imaging
719
720ferro_class_info!(CroppedBitmap {
721    markup: {
722        namespace: "FerroUI.Media.Imaging",
723        constructors: [
724            (Rc<dyn IImage>, PixelRect) => CroppedBitmap::with_source,
725        ],
726        events: [
727            Invalidated(Option<BoxedValue>, EventArgs) => |this: &Ref<CroppedBitmap>, handler: MarkupDelegate| {
728                let sender = this.downgrade();
729                this.invalidated(move || {
730                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
731                })
732            },
733        ],
734    },
735});
736
737// FerroUI.Styling
738
739ferro_class_info!(ContainerQuery {
740    markup: {
741        namespace: "FerroUI.Styling",
742        properties: [
743            Query: Option<StyleQuery> { get: ContainerQuery::query, set: ContainerQuery::set_query },
744            Name: Option<String> { get: ContainerQuery::name, set: ContainerQuery::set_name },
745        ],
746    },
747});
748
749ferro_class_info!(ControlTheme {
750    markup: {
751        namespace: "FerroUI.Styling",
752        constructors: [
753            (&'static TypeInfo) => ControlTheme::with_target_type,
754        ],
755        properties: [
756            TargetType: Option<&'static TypeInfo> { get: ControlTheme::target_type, set: ControlTheme::set_target_type },
757            BasedOn: Option<Ref<ControlTheme>> { get: ControlTheme::based_on, set: ControlTheme::set_based_on },
758        ],
759    },
760});
761
762ferro_class_info!(Style {
763    markup: {
764        namespace: "FerroUI.Styling",
765        properties: [
766            Selector: Option<Selector> { get: Style::selector, set: Style::set_selector },
767        ],
768    },
769});
770
771ferro_class_info!(StyleBase {
772    markup: {
773        namespace: "FerroUI.Styling",
774        properties: [
775            Children: StyleChildren { get: StyleBase::children },
776            Resources: Rc<dyn IResourceDictionary> {
777                get: |this: &Ref<StyleBase>| -> Rc<dyn IResourceDictionary> { this.resources().into() },
778                try_set: |this: &Ref<StyleBase>, value: Rc<dyn IResourceDictionary>| {
779                    match value.as_object().and_then(|object| object.to_ref().cast::<ResourceDictionary>()) {
780                        Some(dictionary) => Ok(this.set_resources(dictionary)),
781                        None => Err("The resource dictionary is not a ResourceDictionary."),
782                    }
783                }
784            },
785            Setters: FerroList<Rc<dyn SetterBase>> { get: StyleBase::setters },
786            Animations: FerroList<Rc<dyn IAnimation>> { get: StyleBase::animations },
787        ],
788        methods: [
789            fn Add(Rc<dyn SetterBase>) => |this: &Ref<StyleBase>, setter: Rc<dyn SetterBase>| this.add(setter),
790            fn Add(Rc<dyn IStyle>) => |this: &Ref<StyleBase>, style: Rc<dyn IStyle>| this.add_style(style),
791        ],
792        events: [
793            OwnerChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<StyleBase>, handler: MarkupDelegate| {
794                let sender = this.downgrade();
795                this.owner_changed(move || {
796                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
797                })
798            },
799        ],
800    },
801});
802
803ferro_class_info!(Styles {
804    markup: {
805        namespace: "FerroUI.Styling",
806        properties: [
807            Resources: Rc<dyn IResourceDictionary> {
808                get: |this: &Ref<Styles>| -> Rc<dyn IResourceDictionary> { this.resources().into() },
809                try_set: |this: &Ref<Styles>, value: Rc<dyn IResourceDictionary>| {
810                    match value.as_object().and_then(|object| object.to_ref().cast::<ResourceDictionary>()) {
811                        Some(dictionary) => Ok(this.set_resources(dictionary)),
812                        None => Err("The resource dictionary is not a ResourceDictionary."),
813                    }
814                }
815            },
816        ],
817        methods: [
818            try fn Add(Rc<dyn IStyle>) => |this: &Ref<Styles>, style: Rc<dyn IStyle>| {
819                // A style that has an owner cannot be added to styles that have one.
820                let owned = style.as_object().and_then(|o| o.to_ref().cast::<StyleBase>()).is_some_and(|s| s.owner().is_some());
821                if owned && this.owner().is_some() {
822                    return Err("The Style already has a parent.");
823                }
824                Ok(this.add(style))
825            },
826        ],
827        events: [
828            OwnerChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<Styles>, handler: MarkupDelegate| {
829                let sender = this.downgrade();
830                this.owner_changed(move || {
831                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
832                })
833            },
834        ],
835    },
836});
837
838// FerroUI.Interactivity
839
840ferro_markup_type!(class RoutedEvent<AccessKeyEventArgs> as "RoutedEvent`1" {
841    namespace: "FerroUI.Interactivity",
842    handles: [RoutedEvent<AccessKeyEventArgs>, Option<RoutedEvent<AccessKeyEventArgs>>],
843    base: RoutedEvent,
844    generic: "RoutedEvent`1" [AccessKeyEventArgs],
845});
846
847ferro_markup_type!(class RoutedEvent<AccessKeyPressedEventArgs> as "RoutedEvent`1" {
848    namespace: "FerroUI.Interactivity",
849    handles: [RoutedEvent<AccessKeyPressedEventArgs>, Option<RoutedEvent<AccessKeyPressedEventArgs>>],
850    base: RoutedEvent,
851    generic: "RoutedEvent`1" [AccessKeyPressedEventArgs],
852});
853
854ferro_markup_type!(class RoutedEvent<ContextRequestedEventArgs> as "RoutedEvent`1" {
855    namespace: "FerroUI.Interactivity",
856    handles: [RoutedEvent<ContextRequestedEventArgs>, Option<RoutedEvent<ContextRequestedEventArgs>>],
857    base: RoutedEvent,
858    generic: "RoutedEvent`1" [ContextRequestedEventArgs],
859});
860
861ferro_markup_type!(class RoutedEvent<DragEventArgs> as "RoutedEvent`1" {
862    namespace: "FerroUI.Interactivity",
863    handles: [RoutedEvent<DragEventArgs>, Option<RoutedEvent<DragEventArgs>>],
864    base: RoutedEvent,
865    generic: "RoutedEvent`1" [DragEventArgs],
866});
867
868ferro_markup_type!(class RoutedEvent<FocusChangedEventArgs> as "RoutedEvent`1" {
869    namespace: "FerroUI.Interactivity",
870    handles: [RoutedEvent<FocusChangedEventArgs>, Option<RoutedEvent<FocusChangedEventArgs>>],
871    base: RoutedEvent,
872    generic: "RoutedEvent`1" [FocusChangedEventArgs],
873});
874
875ferro_markup_type!(class RoutedEvent<FocusChangingEventArgs> as "RoutedEvent`1" {
876    namespace: "FerroUI.Interactivity",
877    handles: [RoutedEvent<FocusChangingEventArgs>, Option<RoutedEvent<FocusChangingEventArgs>>],
878    base: RoutedEvent,
879    generic: "RoutedEvent`1" [FocusChangingEventArgs],
880});
881
882ferro_markup_type!(class RoutedEvent<HoldingRoutedEventArgs> as "RoutedEvent`1" {
883    namespace: "FerroUI.Interactivity",
884    handles: [RoutedEvent<HoldingRoutedEventArgs>, Option<RoutedEvent<HoldingRoutedEventArgs>>],
885    base: RoutedEvent,
886    generic: "RoutedEvent`1" [HoldingRoutedEventArgs],
887});
888
889ferro_markup_type!(class RoutedEvent<KeyEventArgs> as "RoutedEvent`1" {
890    namespace: "FerroUI.Interactivity",
891    handles: [RoutedEvent<KeyEventArgs>, Option<RoutedEvent<KeyEventArgs>>],
892    base: RoutedEvent,
893    generic: "RoutedEvent`1" [KeyEventArgs],
894});
895
896ferro_markup_type!(class RoutedEvent<PinchEndedEventArgs> as "RoutedEvent`1" {
897    namespace: "FerroUI.Interactivity",
898    handles: [RoutedEvent<PinchEndedEventArgs>, Option<RoutedEvent<PinchEndedEventArgs>>],
899    base: RoutedEvent,
900    generic: "RoutedEvent`1" [PinchEndedEventArgs],
901});
902
903ferro_markup_type!(class RoutedEvent<PinchEventArgs> as "RoutedEvent`1" {
904    namespace: "FerroUI.Interactivity",
905    handles: [RoutedEvent<PinchEventArgs>, Option<RoutedEvent<PinchEventArgs>>],
906    base: RoutedEvent,
907    generic: "RoutedEvent`1" [PinchEventArgs],
908});
909
910ferro_markup_type!(class RoutedEvent<PointerCaptureLostEventArgs> as "RoutedEvent`1" {
911    namespace: "FerroUI.Interactivity",
912    handles: [RoutedEvent<PointerCaptureLostEventArgs>, Option<RoutedEvent<PointerCaptureLostEventArgs>>],
913    base: RoutedEvent,
914    generic: "RoutedEvent`1" [PointerCaptureLostEventArgs],
915});
916
917ferro_markup_type!(class RoutedEvent<PointerDeltaEventArgs> as "RoutedEvent`1" {
918    namespace: "FerroUI.Interactivity",
919    handles: [RoutedEvent<PointerDeltaEventArgs>, Option<RoutedEvent<PointerDeltaEventArgs>>],
920    base: RoutedEvent,
921    generic: "RoutedEvent`1" [PointerDeltaEventArgs],
922});
923
924ferro_markup_type!(class RoutedEvent<PointerEventArgs> as "RoutedEvent`1" {
925    namespace: "FerroUI.Interactivity",
926    handles: [RoutedEvent<PointerEventArgs>, Option<RoutedEvent<PointerEventArgs>>],
927    base: RoutedEvent,
928    generic: "RoutedEvent`1" [PointerEventArgs],
929});
930
931ferro_markup_type!(class RoutedEvent<PointerPressedEventArgs> as "RoutedEvent`1" {
932    namespace: "FerroUI.Interactivity",
933    handles: [RoutedEvent<PointerPressedEventArgs>, Option<RoutedEvent<PointerPressedEventArgs>>],
934    base: RoutedEvent,
935    generic: "RoutedEvent`1" [PointerPressedEventArgs],
936});
937
938ferro_markup_type!(class RoutedEvent<PointerReleasedEventArgs> as "RoutedEvent`1" {
939    namespace: "FerroUI.Interactivity",
940    handles: [RoutedEvent<PointerReleasedEventArgs>, Option<RoutedEvent<PointerReleasedEventArgs>>],
941    base: RoutedEvent,
942    generic: "RoutedEvent`1" [PointerReleasedEventArgs],
943});
944
945ferro_markup_type!(class RoutedEvent<PointerWheelEventArgs> as "RoutedEvent`1" {
946    namespace: "FerroUI.Interactivity",
947    handles: [RoutedEvent<PointerWheelEventArgs>, Option<RoutedEvent<PointerWheelEventArgs>>],
948    base: RoutedEvent,
949    generic: "RoutedEvent`1" [PointerWheelEventArgs],
950});
951
952ferro_markup_type!(class RoutedEvent<PullGestureEndedEventArgs> as "RoutedEvent`1" {
953    namespace: "FerroUI.Interactivity",
954    handles: [RoutedEvent<PullGestureEndedEventArgs>, Option<RoutedEvent<PullGestureEndedEventArgs>>],
955    base: RoutedEvent,
956    generic: "RoutedEvent`1" [PullGestureEndedEventArgs],
957});
958
959ferro_markup_type!(class RoutedEvent<PullGestureEventArgs> as "RoutedEvent`1" {
960    namespace: "FerroUI.Interactivity",
961    handles: [RoutedEvent<PullGestureEventArgs>, Option<RoutedEvent<PullGestureEventArgs>>],
962    base: RoutedEvent,
963    generic: "RoutedEvent`1" [PullGestureEventArgs],
964});
965
966ferro_markup_type!(class RoutedEvent<RoutedEventArgs> as "RoutedEvent`1" {
967    namespace: "FerroUI.Interactivity",
968    handles: [RoutedEvent<RoutedEventArgs>, Option<RoutedEvent<RoutedEventArgs>>],
969    base: RoutedEvent,
970    generic: "RoutedEvent`1" [RoutedEventArgs],
971});
972
973ferro_markup_type!(class RoutedEvent<ScrollGestureEndedEventArgs> as "RoutedEvent`1" {
974    namespace: "FerroUI.Interactivity",
975    handles: [RoutedEvent<ScrollGestureEndedEventArgs>, Option<RoutedEvent<ScrollGestureEndedEventArgs>>],
976    base: RoutedEvent,
977    generic: "RoutedEvent`1" [ScrollGestureEndedEventArgs],
978});
979
980ferro_markup_type!(class RoutedEvent<ScrollGestureEventArgs> as "RoutedEvent`1" {
981    namespace: "FerroUI.Interactivity",
982    handles: [RoutedEvent<ScrollGestureEventArgs>, Option<RoutedEvent<ScrollGestureEventArgs>>],
983    base: RoutedEvent,
984    generic: "RoutedEvent`1" [ScrollGestureEventArgs],
985});
986
987ferro_markup_type!(class RoutedEvent<ScrollGestureInertiaStartingEventArgs> as "RoutedEvent`1" {
988    namespace: "FerroUI.Interactivity",
989    handles: [RoutedEvent<ScrollGestureInertiaStartingEventArgs>, Option<RoutedEvent<ScrollGestureInertiaStartingEventArgs>>],
990    base: RoutedEvent,
991    generic: "RoutedEvent`1" [ScrollGestureInertiaStartingEventArgs],
992});
993
994ferro_markup_type!(class RoutedEvent<SwipeGestureEndedEventArgs> as "RoutedEvent`1" {
995    namespace: "FerroUI.Interactivity",
996    handles: [RoutedEvent<SwipeGestureEndedEventArgs>, Option<RoutedEvent<SwipeGestureEndedEventArgs>>],
997    base: RoutedEvent,
998    generic: "RoutedEvent`1" [SwipeGestureEndedEventArgs],
999});
1000
1001ferro_markup_type!(class RoutedEvent<SwipeGestureEventArgs> as "RoutedEvent`1" {
1002    namespace: "FerroUI.Interactivity",
1003    handles: [RoutedEvent<SwipeGestureEventArgs>, Option<RoutedEvent<SwipeGestureEventArgs>>],
1004    base: RoutedEvent,
1005    generic: "RoutedEvent`1" [SwipeGestureEventArgs],
1006});
1007
1008ferro_markup_type!(class RoutedEvent<TappedEventArgs> as "RoutedEvent`1" {
1009    namespace: "FerroUI.Interactivity",
1010    handles: [RoutedEvent<TappedEventArgs>, Option<RoutedEvent<TappedEventArgs>>],
1011    base: RoutedEvent,
1012    generic: "RoutedEvent`1" [TappedEventArgs],
1013});
1014
1015ferro_markup_type!(class RoutedEvent<TextInputEventArgs> as "RoutedEvent`1" {
1016    namespace: "FerroUI.Interactivity",
1017    handles: [RoutedEvent<TextInputEventArgs>, Option<RoutedEvent<TextInputEventArgs>>],
1018    base: RoutedEvent,
1019    generic: "RoutedEvent`1" [TextInputEventArgs],
1020});
1021
1022ferro_markup_type!(class RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs> as "RoutedEvent`1" {
1023    namespace: "FerroUI.Interactivity",
1024    handles: [RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs>, Option<RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs>>],
1025    base: RoutedEvent,
1026    generic: "RoutedEvent`1" [TextInputMethodClientRequeryRequestedEventArgs],
1027});
1028
1029ferro_markup_type!(class RoutedEvent<TextInputMethodClientRequestedEventArgs> as "RoutedEvent`1" {
1030    namespace: "FerroUI.Interactivity",
1031    handles: [RoutedEvent<TextInputMethodClientRequestedEventArgs>, Option<RoutedEvent<TextInputMethodClientRequestedEventArgs>>],
1032    base: RoutedEvent,
1033    generic: "RoutedEvent`1" [TextInputMethodClientRequestedEventArgs],
1034});
1035
1036// The typed arguments of routed events.
1037
1038/// The arguments of a routed event as the typed arguments `T`.
1039fn typed_event_args<T: 'static, R>(e: &Rc<dyn IRoutedEventArgs>, f: impl FnOnce(&T) -> R) -> Result<R, String> {
1040    match e.query_args(std::any::TypeId::of::<T>()).and_then(|args| args.downcast_ref::<T>()) {
1041        Some(args) => Ok(f(args)),
1042        None => Err(format!("The arguments are not {}.", std::any::type_name::<T>())),
1043    }
1044}
1045
1046ferro_markup_type!(class AccessKeyEventArgs {
1047    namespace: "FerroUI.Input",
1048    handles: [AccessKeyEventArgs],
1049    this: Rc<dyn IRoutedEventArgs>,
1050    base: Rc<dyn IRoutedEventArgs>,
1051    properties: [
1052        IsMultiple: bool {
1053            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<AccessKeyEventArgs, _>(e, |e| e.is_multiple())
1054        },
1055    ],
1056});
1057
1058ferro_markup_type!(class AccessKeyPressedEventArgs {
1059    namespace: "FerroUI.Input",
1060    handles: [AccessKeyPressedEventArgs],
1061    this: Rc<dyn IRoutedEventArgs>,
1062    base: Rc<dyn IRoutedEventArgs>,
1063});
1064
1065ferro_markup_type!(class ContextRequestedEventArgs {
1066    namespace: "FerroUI.Input",
1067    handles: [ContextRequestedEventArgs],
1068    this: Rc<dyn IRoutedEventArgs>,
1069    base: Rc<dyn IRoutedEventArgs>,
1070});
1071
1072ferro_markup_type!(class DragEventArgs {
1073    namespace: "FerroUI.Input",
1074    handles: [DragEventArgs],
1075    this: Rc<dyn IRoutedEventArgs>,
1076    base: Rc<dyn IRoutedEventArgs>,
1077    properties: [
1078        DragEffects: DragDropEffects {
1079            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<DragEventArgs, _>(e, |e| e.drag_effects()),
1080            try_set: |e: &Rc<dyn IRoutedEventArgs>, value: DragDropEffects| typed_event_args::<DragEventArgs, _>(e, |e| e.set_drag_effects(value))
1081        },
1082        KeyModifiers: KeyModifiers {
1083            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<DragEventArgs, _>(e, |e| e.key_modifiers())
1084        },
1085    ],
1086});
1087
1088ferro_markup_type!(class FocusChangedEventArgs {
1089    namespace: "FerroUI.Input",
1090    handles: [FocusChangedEventArgs],
1091    this: Rc<dyn IRoutedEventArgs>,
1092    base: Rc<dyn IRoutedEventArgs>,
1093});
1094
1095ferro_markup_type!(class FocusChangingEventArgs {
1096    namespace: "FerroUI.Input",
1097    handles: [FocusChangingEventArgs],
1098    this: Rc<dyn IRoutedEventArgs>,
1099    base: Rc<dyn IRoutedEventArgs>,
1100    properties: [
1101        NewFocusedElement: Option<Ref<InputElement>> {
1102            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<FocusChangingEventArgs, _>(e, |e| e.new_focused_element())
1103        },
1104        Canceled: bool {
1105            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<FocusChangingEventArgs, _>(e, |e| e.canceled())
1106        },
1107    ],
1108});
1109
1110ferro_markup_type!(class HoldingRoutedEventArgs {
1111    namespace: "FerroUI.Input",
1112    handles: [HoldingRoutedEventArgs],
1113    this: Rc<dyn IRoutedEventArgs>,
1114    base: Rc<dyn IRoutedEventArgs>,
1115    properties: [
1116        HoldingState: HoldingState {
1117            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<HoldingRoutedEventArgs, _>(e, |e| e.holding_state())
1118        },
1119        Position: Point {
1120            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<HoldingRoutedEventArgs, _>(e, |e| e.position())
1121        },
1122        PointerType: PointerType {
1123            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<HoldingRoutedEventArgs, _>(e, |e| e.pointer_type())
1124        },
1125    ],
1126});
1127
1128ferro_markup_type!(class KeyEventArgs {
1129    namespace: "FerroUI.Input",
1130    handles: [KeyEventArgs],
1131    this: Rc<dyn IRoutedEventArgs>,
1132    base: Rc<dyn IRoutedEventArgs>,
1133});
1134
1135ferro_markup_type!(class PinchEndedEventArgs {
1136    namespace: "FerroUI.Input",
1137    handles: [PinchEndedEventArgs],
1138    this: Rc<dyn IRoutedEventArgs>,
1139    base: Rc<dyn IRoutedEventArgs>,
1140});
1141
1142ferro_markup_type!(class PinchEventArgs {
1143    namespace: "FerroUI.Input",
1144    handles: [PinchEventArgs],
1145    this: Rc<dyn IRoutedEventArgs>,
1146    base: Rc<dyn IRoutedEventArgs>,
1147    properties: [
1148        Scale: f64 {
1149            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PinchEventArgs, _>(e, |e| e.scale())
1150        },
1151        ScaleOrigin: Point {
1152            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PinchEventArgs, _>(e, |e| e.scale_origin())
1153        },
1154        Angle: f64 {
1155            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PinchEventArgs, _>(e, |e| e.angle())
1156        },
1157        AngleDelta: f64 {
1158            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PinchEventArgs, _>(e, |e| e.angle_delta())
1159        },
1160    ],
1161});
1162
1163ferro_markup_type!(class PointerCaptureLostEventArgs {
1164    namespace: "FerroUI.Input",
1165    handles: [PointerCaptureLostEventArgs],
1166    this: Rc<dyn IRoutedEventArgs>,
1167    base: Rc<dyn IRoutedEventArgs>,
1168});
1169
1170ferro_markup_type!(class PointerDeltaEventArgs {
1171    namespace: "FerroUI.Input",
1172    handles: [PointerDeltaEventArgs],
1173    this: Rc<dyn IRoutedEventArgs>,
1174    base: PointerEventArgs,
1175    properties: [
1176        Delta: Vector {
1177            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PointerDeltaEventArgs, _>(e, |e| e.delta())
1178        },
1179    ],
1180});
1181
1182ferro_markup_type!(class PointerEventArgs {
1183    namespace: "FerroUI.Input",
1184    handles: [PointerEventArgs],
1185    this: Rc<dyn IRoutedEventArgs>,
1186    base: Rc<dyn IRoutedEventArgs>,
1187    properties: [
1188        Timestamp: u64 {
1189            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PointerEventArgs, _>(e, |e| e.timestamp())
1190        },
1191        KeyModifiers: KeyModifiers {
1192            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PointerEventArgs, _>(e, |e| e.key_modifiers())
1193        },
1194    ],
1195});
1196
1197ferro_markup_type!(class PointerPressedEventArgs {
1198    namespace: "FerroUI.Input",
1199    handles: [PointerPressedEventArgs],
1200    this: Rc<dyn IRoutedEventArgs>,
1201    base: PointerEventArgs,
1202    properties: [
1203        ClickCount: i32 {
1204            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PointerPressedEventArgs, _>(e, |e| e.click_count())
1205        },
1206    ],
1207});
1208
1209ferro_markup_type!(class PointerReleasedEventArgs {
1210    namespace: "FerroUI.Input",
1211    handles: [PointerReleasedEventArgs],
1212    this: Rc<dyn IRoutedEventArgs>,
1213    base: PointerEventArgs,
1214});
1215
1216ferro_markup_type!(class PointerWheelEventArgs {
1217    namespace: "FerroUI.Input",
1218    handles: [PointerWheelEventArgs],
1219    this: Rc<dyn IRoutedEventArgs>,
1220    base: PointerEventArgs,
1221    properties: [
1222        Delta: Vector {
1223            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PointerWheelEventArgs, _>(e, |e| e.delta())
1224        },
1225    ],
1226});
1227
1228ferro_markup_type!(class PullGestureEndedEventArgs {
1229    namespace: "FerroUI.Input",
1230    handles: [PullGestureEndedEventArgs],
1231    this: Rc<dyn IRoutedEventArgs>,
1232    base: Rc<dyn IRoutedEventArgs>,
1233    properties: [
1234        Id: i32 {
1235            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PullGestureEndedEventArgs, _>(e, |e| e.id())
1236        },
1237        PullDirection: PullDirection {
1238            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PullGestureEndedEventArgs, _>(e, |e| e.pull_direction())
1239        },
1240    ],
1241});
1242
1243ferro_markup_type!(class PullGestureEventArgs {
1244    namespace: "FerroUI.Input",
1245    handles: [PullGestureEventArgs],
1246    this: Rc<dyn IRoutedEventArgs>,
1247    base: Rc<dyn IRoutedEventArgs>,
1248    properties: [
1249        Id: i32 {
1250            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PullGestureEventArgs, _>(e, |e| e.id())
1251        },
1252        Delta: Vector {
1253            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PullGestureEventArgs, _>(e, |e| e.delta())
1254        },
1255        PullDirection: PullDirection {
1256            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PullGestureEventArgs, _>(e, |e| e.pull_direction())
1257        },
1258    ],
1259});
1260
1261ferro_markup_type!(class ScrollGestureEndedEventArgs {
1262    namespace: "FerroUI.Input",
1263    handles: [ScrollGestureEndedEventArgs],
1264    this: Rc<dyn IRoutedEventArgs>,
1265    base: Rc<dyn IRoutedEventArgs>,
1266    properties: [
1267        Id: i32 {
1268            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureEndedEventArgs, _>(e, |e| e.id())
1269        },
1270    ],
1271});
1272
1273ferro_markup_type!(class ScrollGestureEventArgs {
1274    namespace: "FerroUI.Input",
1275    handles: [ScrollGestureEventArgs],
1276    this: Rc<dyn IRoutedEventArgs>,
1277    base: Rc<dyn IRoutedEventArgs>,
1278    properties: [
1279        Id: i32 {
1280            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureEventArgs, _>(e, |e| e.id())
1281        },
1282        Delta: Vector {
1283            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureEventArgs, _>(e, |e| e.delta())
1284        },
1285        ShouldEndScrollGesture: bool {
1286            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureEventArgs, _>(e, |e| e.should_end_scroll_gesture()),
1287            try_set: |e: &Rc<dyn IRoutedEventArgs>, value: bool| typed_event_args::<ScrollGestureEventArgs, _>(e, |e| e.set_should_end_scroll_gesture(value))
1288        },
1289    ],
1290});
1291
1292ferro_markup_type!(class ScrollGestureInertiaStartingEventArgs {
1293    namespace: "FerroUI.Input",
1294    handles: [ScrollGestureInertiaStartingEventArgs],
1295    this: Rc<dyn IRoutedEventArgs>,
1296    base: Rc<dyn IRoutedEventArgs>,
1297    properties: [
1298        Id: i32 {
1299            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureInertiaStartingEventArgs, _>(e, |e| e.id())
1300        },
1301        Inertia: Vector {
1302            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<ScrollGestureInertiaStartingEventArgs, _>(e, |e| e.inertia())
1303        },
1304    ],
1305});
1306
1307ferro_markup_type!(class SwipeGestureEndedEventArgs {
1308    namespace: "FerroUI.Input",
1309    handles: [SwipeGestureEndedEventArgs],
1310    this: Rc<dyn IRoutedEventArgs>,
1311    base: Rc<dyn IRoutedEventArgs>,
1312    properties: [
1313        Id: i32 {
1314            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEndedEventArgs, _>(e, |e| e.id())
1315        },
1316        Velocity: Vector {
1317            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEndedEventArgs, _>(e, |e| e.velocity())
1318        },
1319    ],
1320});
1321
1322ferro_markup_type!(class SwipeGestureEventArgs {
1323    namespace: "FerroUI.Input",
1324    handles: [SwipeGestureEventArgs],
1325    this: Rc<dyn IRoutedEventArgs>,
1326    base: Rc<dyn IRoutedEventArgs>,
1327    properties: [
1328        Id: i32 {
1329            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEventArgs, _>(e, |e| e.id())
1330        },
1331        Delta: Vector {
1332            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEventArgs, _>(e, |e| e.delta())
1333        },
1334        Velocity: Vector {
1335            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEventArgs, _>(e, |e| e.velocity())
1336        },
1337        SwipeDirection: SwipeDirection {
1338            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SwipeGestureEventArgs, _>(e, |e| e.swipe_direction())
1339        },
1340    ],
1341});
1342
1343ferro_markup_type!(class TappedEventArgs {
1344    namespace: "FerroUI.Input",
1345    handles: [TappedEventArgs],
1346    this: Rc<dyn IRoutedEventArgs>,
1347    base: Rc<dyn IRoutedEventArgs>,
1348    properties: [
1349        KeyModifiers: KeyModifiers {
1350            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<TappedEventArgs, _>(e, |e| e.key_modifiers())
1351        },
1352        Timestamp: u64 {
1353            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<TappedEventArgs, _>(e, |e| e.timestamp())
1354        },
1355    ],
1356});
1357
1358ferro_markup_type!(class TextInputEventArgs {
1359    namespace: "FerroUI.Input",
1360    handles: [TextInputEventArgs],
1361    this: Rc<dyn IRoutedEventArgs>,
1362    base: Rc<dyn IRoutedEventArgs>,
1363});
1364
1365ferro_markup_type!(class TextInputMethodClientRequeryRequestedEventArgs {
1366    namespace: "FerroUI.Input.TextInput",
1367    handles: [TextInputMethodClientRequeryRequestedEventArgs],
1368    this: Rc<dyn IRoutedEventArgs>,
1369    base: Rc<dyn IRoutedEventArgs>,
1370});
1371
1372ferro_markup_type!(class TextInputMethodClientRequestedEventArgs {
1373    namespace: "FerroUI.Input.TextInput",
1374    handles: [TextInputMethodClientRequestedEventArgs],
1375    this: Rc<dyn IRoutedEventArgs>,
1376    base: Rc<dyn IRoutedEventArgs>,
1377});
1378
1379/// Registers the casts of the typed routed events declared in this file to the
1380/// untyped routed event, with the untyped value conversions of the current thread.
1381pub(super) fn register_value_types() {
1382    ValueTypes::register_cast::<RoutedEvent<AccessKeyEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1383    ValueTypes::register_cast::<RoutedEvent<AccessKeyPressedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1384    ValueTypes::register_cast::<RoutedEvent<ContextRequestedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1385    ValueTypes::register_cast::<RoutedEvent<DragEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1386    ValueTypes::register_cast::<RoutedEvent<FocusChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1387    ValueTypes::register_cast::<RoutedEvent<FocusChangingEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1388    ValueTypes::register_cast::<RoutedEvent<HoldingRoutedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1389    ValueTypes::register_cast::<RoutedEvent<KeyEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1390    ValueTypes::register_cast::<RoutedEvent<PinchEndedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1391    ValueTypes::register_cast::<RoutedEvent<PinchEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1392    ValueTypes::register_cast::<RoutedEvent<PointerCaptureLostEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1393    ValueTypes::register_cast::<RoutedEvent<PointerDeltaEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1394    ValueTypes::register_cast::<RoutedEvent<PointerEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1395    ValueTypes::register_cast::<RoutedEvent<PointerPressedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1396    ValueTypes::register_cast::<RoutedEvent<PointerReleasedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1397    ValueTypes::register_cast::<RoutedEvent<PointerWheelEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1398    ValueTypes::register_cast::<RoutedEvent<PullGestureEndedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1399    ValueTypes::register_cast::<RoutedEvent<PullGestureEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1400    ValueTypes::register_cast::<RoutedEvent<RoutedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1401    ValueTypes::register_cast::<RoutedEvent<ScrollGestureEndedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1402    ValueTypes::register_cast::<RoutedEvent<ScrollGestureEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1403    ValueTypes::register_cast::<RoutedEvent<ScrollGestureInertiaStartingEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1404    ValueTypes::register_cast::<RoutedEvent<SwipeGestureEndedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1405    ValueTypes::register_cast::<RoutedEvent<SwipeGestureEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1406    ValueTypes::register_cast::<RoutedEvent<TappedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1407    ValueTypes::register_cast::<RoutedEvent<TextInputEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1408    ValueTypes::register_cast::<RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1409    ValueTypes::register_cast::<RoutedEvent<TextInputMethodClientRequestedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1410}
1411
1412/// The types declared in this file that are not classes: the types that own static
1413/// members only and the typed routed events. (The metadata of a class is reached
1414/// from its runtime type and needs no registration.)
1415pub(super) const TYPES: &[&MarkupType] = &[
1416    <AccessKeyHandler as MarkupTyped>::MARKUP,
1417    <DragDrop as MarkupTyped>::MARKUP,
1418    <InputMethod as MarkupTyped>::MARKUP,
1419    <NameScope as MarkupTyped>::MARKUP,
1420    <RoutedEvent<AccessKeyEventArgs> as MarkupTyped>::MARKUP,
1421    <RoutedEvent<AccessKeyPressedEventArgs> as MarkupTyped>::MARKUP,
1422    <RoutedEvent<ContextRequestedEventArgs> as MarkupTyped>::MARKUP,
1423    <RoutedEvent<DragEventArgs> as MarkupTyped>::MARKUP,
1424    <RoutedEvent<FocusChangedEventArgs> as MarkupTyped>::MARKUP,
1425    <RoutedEvent<FocusChangingEventArgs> as MarkupTyped>::MARKUP,
1426    <RoutedEvent<HoldingRoutedEventArgs> as MarkupTyped>::MARKUP,
1427    <RoutedEvent<KeyEventArgs> as MarkupTyped>::MARKUP,
1428    <RoutedEvent<PinchEndedEventArgs> as MarkupTyped>::MARKUP,
1429    <RoutedEvent<PinchEventArgs> as MarkupTyped>::MARKUP,
1430    <RoutedEvent<PointerCaptureLostEventArgs> as MarkupTyped>::MARKUP,
1431    <RoutedEvent<PointerDeltaEventArgs> as MarkupTyped>::MARKUP,
1432    <RoutedEvent<PointerEventArgs> as MarkupTyped>::MARKUP,
1433    <RoutedEvent<PointerPressedEventArgs> as MarkupTyped>::MARKUP,
1434    <RoutedEvent<PointerReleasedEventArgs> as MarkupTyped>::MARKUP,
1435    <RoutedEvent<PointerWheelEventArgs> as MarkupTyped>::MARKUP,
1436    <RoutedEvent<PullGestureEndedEventArgs> as MarkupTyped>::MARKUP,
1437    <RoutedEvent<PullGestureEventArgs> as MarkupTyped>::MARKUP,
1438    <RoutedEvent<RoutedEventArgs> as MarkupTyped>::MARKUP,
1439    <RoutedEvent<ScrollGestureEndedEventArgs> as MarkupTyped>::MARKUP,
1440    <RoutedEvent<ScrollGestureEventArgs> as MarkupTyped>::MARKUP,
1441    <RoutedEvent<ScrollGestureInertiaStartingEventArgs> as MarkupTyped>::MARKUP,
1442    <RoutedEvent<SwipeGestureEndedEventArgs> as MarkupTyped>::MARKUP,
1443    <RoutedEvent<SwipeGestureEventArgs> as MarkupTyped>::MARKUP,
1444    <RoutedEvent<TappedEventArgs> as MarkupTyped>::MARKUP,
1445    <RoutedEvent<TextInputEventArgs> as MarkupTyped>::MARKUP,
1446    <RoutedEvent<TextInputMethodClientRequeryRequestedEventArgs> as MarkupTyped>::MARKUP,
1447    <RoutedEvent<TextInputMethodClientRequestedEventArgs> as MarkupTyped>::MARKUP,
1448    <AccessKeyEventArgs as MarkupTyped>::MARKUP,
1449    <AccessKeyPressedEventArgs as MarkupTyped>::MARKUP,
1450    <ContextRequestedEventArgs as MarkupTyped>::MARKUP,
1451    <DragEventArgs as MarkupTyped>::MARKUP,
1452    <FocusChangedEventArgs as MarkupTyped>::MARKUP,
1453    <FocusChangingEventArgs as MarkupTyped>::MARKUP,
1454    <HoldingRoutedEventArgs as MarkupTyped>::MARKUP,
1455    <KeyEventArgs as MarkupTyped>::MARKUP,
1456    <PinchEndedEventArgs as MarkupTyped>::MARKUP,
1457    <PinchEventArgs as MarkupTyped>::MARKUP,
1458    <PointerCaptureLostEventArgs as MarkupTyped>::MARKUP,
1459    <PointerDeltaEventArgs as MarkupTyped>::MARKUP,
1460    <PointerEventArgs as MarkupTyped>::MARKUP,
1461    <PointerPressedEventArgs as MarkupTyped>::MARKUP,
1462    <PointerReleasedEventArgs as MarkupTyped>::MARKUP,
1463    <PointerWheelEventArgs as MarkupTyped>::MARKUP,
1464    <PullGestureEndedEventArgs as MarkupTyped>::MARKUP,
1465    <PullGestureEventArgs as MarkupTyped>::MARKUP,
1466    <ScrollGestureEndedEventArgs as MarkupTyped>::MARKUP,
1467    <ScrollGestureEventArgs as MarkupTyped>::MARKUP,
1468    <ScrollGestureInertiaStartingEventArgs as MarkupTyped>::MARKUP,
1469    <SwipeGestureEndedEventArgs as MarkupTyped>::MARKUP,
1470    <SwipeGestureEventArgs as MarkupTyped>::MARKUP,
1471    <TappedEventArgs as MarkupTyped>::MARKUP,
1472    <TextInputEventArgs as MarkupTyped>::MARKUP,
1473    <TextInputMethodClientRequeryRequestedEventArgs as MarkupTyped>::MARKUP,
1474    <TextInputMethodClientRequestedEventArgs as MarkupTyped>::MARKUP,
1475];