Skip to main content

ferroui_controls/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 crate::animation::*;
18use crate::application_lifetimes::IApplicationLifetime;
19use crate::automation::peers::*;
20use crate::chrome::*;
21use crate::documents::*;
22use crate::presenters::*;
23use crate::pull_to_refresh::*;
24use crate::templates::{DataTemplates, IDataTemplate, ITemplateOf};
25use crate::primitives::*;
26use crate::*;
27use ferroui_base::animation::easings::Easing;
28use ferroui_base::animation::TimeSpan;
29use ferroui_base::collections::FerroList;
30use ferroui_base::controls::{Classes, IResourceDictionary, ResourceDictionary, ResourcesChangedEventArgs};
31use ferroui_base::data::core::ValueTypes;
32use ferroui_base::input::*;
33use ferroui_base::interactivity::*;
34use ferroui_base::media::{
35    FontFamily, FontFeatureCollection, FontStretch, FontStyle, FontWeight, IBrush, TextAlignment, TextDecorationCollection,
36    TextTrimming, TextWrapping,
37};
38use ferroui_base::metadata::{into_markup_value, MarkupDelegate, MarkupType};
39use ferroui_base::styling::*;
40use ferroui_base::utilities::{CancelEventArgs, EventArgs};
41use ferroui_base::{ferro_class_info, BoxedValue, FerroObject, IFerroDependencyResolver, PixelPoint, Rect, Ref, Size, Vector};
42use std::rc::Rc;
43use ferroui_base::ferro_markup_type;
44use ferroui_base::metadata::MarkupTyped;
45
46// FerroUI
47
48ferro_class_info!(Application {
49    markup: {
50        namespace: "FerroUI",
51        properties: [
52            Styles: Ref<Styles> { get: Application::styles },
53            ApplicationLifetime: Option<Rc<dyn IApplicationLifetime>> { set: Application::set_application_lifetime },
54            DataTemplates: DataTemplates { get: Application::data_templates },
55            Resources: Rc<dyn IResourceDictionary> {
56                get: |this: &Ref<Application>| -> Rc<dyn IResourceDictionary> { this.resources().into() },
57                try_set: |this: &Ref<Application>, value: Rc<dyn IResourceDictionary>| {
58                    match value.as_object().and_then(|object| object.to_ref().cast::<ResourceDictionary>()) {
59                        Some(dictionary) => Ok(this.set_resources(dictionary)),
60                        None => Err("The resource dictionary is not a ResourceDictionary."),
61                    }
62                }
63            },
64        ],
65        static_properties: [
66            Current: Option<Ref<Application>> { get: Application::current },
67        ],
68        events: [
69            ResourcesChanged(Option<BoxedValue>, ResourcesChangedEventArgs) => |this: &Ref<Application>, handler: MarkupDelegate| {
70                let sender = this.downgrade();
71                this.resources_changed(move |e: &ResourcesChangedEventArgs| {
72                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
73                })
74            },
75            ActualThemeVariantChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<Application>, handler: MarkupDelegate| {
76                let sender = this.downgrade();
77                this.actual_theme_variant_changed(move || {
78                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
79                })
80            },
81        ],
82    },
83});
84
85// FerroUI.Animation
86
87ferro_class_info!(ConnectedAnimationService {
88    markup: {
89        namespace: "FerroUI.Animation",
90        properties: [
91            DefaultDuration: TimeSpan { get: ConnectedAnimationService::default_duration, set: ConnectedAnimationService::set_default_duration },
92            DefaultEasingFunction: Option<Easing> { get: ConnectedAnimationService::default_easing_function, set: ConnectedAnimationService::set_default_easing_function },
93        ],
94    },
95});
96
97// FerroUI.Automation.Peers
98
99ferro_class_info!(AutomationPeer {
100    markup: {
101        namespace: "FerroUI.Automation.Peers",
102        events: [
103            ChildrenChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<AutomationPeer>, handler: MarkupDelegate| {
104                let sender = this.downgrade();
105                this.children_changed(move || {
106                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
107                })
108            },
109        ],
110    },
111});
112
113ferro_class_info!(WindowBaseAutomationPeer {
114    markup: {
115        namespace: "FerroUI.Automation.Peers",
116        events: [
117            FocusChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<WindowBaseAutomationPeer>, handler: MarkupDelegate| {
118                let sender = this.downgrade();
119                this.focus_changed(move || {
120                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
121                })
122            },
123        ],
124    },
125});
126
127// FerroUI.Controls
128
129ferro_class_info!(Button {
130    markup: {
131        namespace: "FerroUI.Controls",
132        fields: [
133            ClickEvent: RoutedEvent<RoutedEventArgs> => || *Button::click_event(),
134        ],
135        attributes: [PseudoClasses(":flyout-open", ":pressed")],
136    },
137});
138
139ferro_class_info!(ButtonSpinner {
140    markup: {
141        namespace: "FerroUI.Controls",
142        attributes: [
143            TemplatePart("PART_DecreaseButton", type(Ref<Button>)),
144            TemplatePart("PART_IncreaseButton", type(Ref<Button>)),
145            PseudoClasses(":left", ":right"),
146        ],
147    },
148});
149
150ferro_class_info!(Canvas {
151    markup: {
152        namespace: "FerroUI.Controls",
153        methods: [
154            static fn GetLeft(Ref<FerroObject>) -> f64 =>
155                |element: Ref<FerroObject>| element.get_value(Canvas::left_property()),
156            static fn SetLeft(Ref<FerroObject>, f64) =>
157                |element: Ref<FerroObject>, value: f64| element.set_value(Canvas::left_property(), value),
158            static fn GetTop(Ref<FerroObject>) -> f64 =>
159                |element: Ref<FerroObject>| element.get_value(Canvas::top_property()),
160            static fn SetTop(Ref<FerroObject>, f64) =>
161                |element: Ref<FerroObject>, value: f64| element.set_value(Canvas::top_property(), value),
162            static fn GetRight(Ref<FerroObject>) -> f64 =>
163                |element: Ref<FerroObject>| element.get_value(Canvas::right_property()),
164            static fn SetRight(Ref<FerroObject>, f64) =>
165                |element: Ref<FerroObject>, value: f64| element.set_value(Canvas::right_property(), value),
166            static fn GetBottom(Ref<FerroObject>) -> f64 =>
167                |element: Ref<FerroObject>| element.get_value(Canvas::bottom_property()),
168            static fn SetBottom(Ref<FerroObject>, f64) =>
169                |element: Ref<FerroObject>, value: f64| element.set_value(Canvas::bottom_property(), value),
170        ],
171    },
172});
173
174ferro_class_info!(ColumnDefinition {
175    markup: {
176        namespace: "FerroUI.Controls",
177        constructors: [
178            (f64, GridUnitType) => ColumnDefinition::with_value,
179            (GridLength) => ColumnDefinition::with_width,
180        ],
181    },
182});
183
184ferro_class_info!(ComboBox {
185    markup: {
186        namespace: "FerroUI.Controls",
187        property_attributes: [
188            SelectionBoxItemTemplate: [InheritDataTypeFromItems("ItemsSource")],
189        ],
190        events: [
191            DropDownClosed(Option<BoxedValue>, EventArgs) => |this: &Ref<ComboBox>, handler: MarkupDelegate| {
192                let sender = this.downgrade();
193                this.drop_down_closed(move || {
194                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
195                })
196            },
197            DropDownOpened(Option<BoxedValue>, EventArgs) => |this: &Ref<ComboBox>, handler: MarkupDelegate| {
198                let sender = this.downgrade();
199                this.drop_down_opened(move || {
200                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
201                })
202            },
203        ],
204        attributes: [
205            TemplatePart("PART_Popup", type(Ref<Popup>), IsRequired = true),
206            TemplatePart("PART_EditableTextBox", type(Ref<TextBox>), IsRequired = false),
207            PseudoClasses(":dropdownopen", ":pressed"),
208        ],
209    },
210});
211
212ferro_class_info!(ContentControl {
213    markup: {
214        namespace: "FerroUI.Controls",
215        content: Content,
216        property_attributes: [
217            Content: [DependsOn("ContentTemplate")],
218        ],
219        attributes: [
220            TemplatePart("PART_ContentPresenter", type(Ref<ContentPresenter>)),
221            PseudoClasses(":empty"),
222        ],
223    },
224});
225
226ferro_class_info!(ContextMenu {
227    markup: {
228        namespace: "FerroUI.Controls",
229        events: [
230            Opening(Option<BoxedValue>, CancelEventArgs) => |this: &Ref<ContextMenu>, handler: MarkupDelegate| {
231                let sender = this.downgrade();
232                this.opening(move |e: &CancelEventArgs| {
233                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
234                })
235            },
236            Closing(Option<BoxedValue>, CancelEventArgs) => |this: &Ref<ContextMenu>, handler: MarkupDelegate| {
237                let sender = this.downgrade();
238                this.closing(move |e: &CancelEventArgs| {
239                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
240                })
241            },
242        ],
243    },
244});
245
246ferro_class_info!(Control {
247    markup: {
248        namespace: "FerroUI.Controls",
249        properties: [
250            DataTemplates: DataTemplates { get: Control::data_templates },
251        ],
252        fields: [
253            RequestBringIntoViewEvent: RoutedEvent<RequestBringIntoViewEventArgs> => || *Control::request_bring_into_view_event(),
254            LoadedEvent: RoutedEvent<RoutedEventArgs> => || *Control::loaded_event(),
255            UnloadedEvent: RoutedEvent<RoutedEventArgs> => || *Control::unloaded_event(),
256            SizeChangedEvent: RoutedEvent<SizeChangedEventArgs> => || *Control::size_changed_event(),
257        ],
258    },
259});
260
261// `SetError` has no getter and no registered property in the managed original either: markup sees it as the
262// attached property `DataValidationErrors.Error`.
263ferro_class_info!(DataValidationErrors {
264    markup: {
265        namespace: "FerroUI.Controls",
266        methods: [
267            static fn SetError(Ref<Control>, Option<ferroui_base::data::BindingError>) =>
268                |control: Ref<Control>, error: Option<ferroui_base::data::BindingError>| {
269                    DataValidationErrors::set_error(&control, error.as_ref())
270                },
271        ],
272        attributes: [PseudoClasses(":error")],
273    },
274});
275
276ferro_class_info!(Decorator {
277    markup: {
278        namespace: "FerroUI.Controls",
279        content: Child,
280    },
281});
282
283ferro_class_info!(DefinitionBase {
284    markup: {
285        namespace: "FerroUI.Controls",
286        properties: [
287            SharedSizeGroup: Option<String> {
288                get: |this: &Ref<DefinitionBase>| this.get_value(DefinitionBase::shared_size_group_property()),
289                set: |this: &Ref<DefinitionBase>, value: Option<String>| this.set_value(DefinitionBase::shared_size_group_property(), value)
290            },
291        ],
292    },
293});
294
295ferro_markup_type!(static Design {
296    namespace: "FerroUI.Controls",
297    type_info: Design,
298    methods: [
299        static fn SetDataContext(Rc<dyn IDataTemplate>, Option<BoxedValue>) =>
300                |template: Rc<dyn IDataTemplate>, value: Option<BoxedValue>| Design::set_data_context_for_data_template(&template, value),
301        static fn GetDataContext(Rc<dyn IDataTemplate>) -> Option<BoxedValue> =>
302                |template: Rc<dyn IDataTemplate>| Design::get_data_context_for_data_template(&template),
303        static fn SetPreviewWith(Ref<FerroObject>, Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>) =>
304                |target: Ref<FerroObject>, template: Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>| Design::set_preview_with_template(&target, template),
305        static fn SetPreviewWith(Ref<FerroObject>, Option<Ref<Control>>) =>
306                |target: Ref<FerroObject>, control: Option<Ref<Control>>| Design::set_preview_with(&target, control),
307        static fn SetPreviewWith(Ref<ResourceDictionary>, Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>) =>
308                |target: Ref<ResourceDictionary>, template: Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>| {
309                    Design::set_preview_with_template(&target.upcast(), template)
310                },
311        static fn SetPreviewWith(Ref<ResourceDictionary>, Option<Ref<Control>>) =>
312                |target: Ref<ResourceDictionary>, control: Option<Ref<Control>>| Design::set_preview_with(&target.upcast(), control),
313        static fn SetPreviewWith(Rc<dyn IDataTemplate>, Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>) =>
314                |target: Rc<dyn IDataTemplate>, template: Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>| Design::set_preview_with_template_for_data_template(&target, template),
315        static fn SetPreviewWith(Rc<dyn IDataTemplate>, Option<Ref<Control>>) =>
316                |target: Rc<dyn IDataTemplate>, control: Option<Ref<Control>>| Design::set_preview_with_for_data_template(&target, control),
317        static fn SetPreviewWith(Rc<dyn IStyle>, Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>) =>
318                |target: Rc<dyn IStyle>, template: Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>| Design::set_preview_with_template_for_style(&target, template),
319        static fn SetPreviewWith(Rc<dyn IStyle>, Option<Ref<Control>>) =>
320                |target: Rc<dyn IStyle>, control: Option<Ref<Control>>| Design::set_preview_with_for_style(&target, control),
321        static fn GetPreviewWith(Ref<FerroObject>) -> Option<Ref<Control>> =>
322                |target: Ref<FerroObject>| Design::get_preview_with(&target),
323        static fn GetPreviewWith(Ref<ResourceDictionary>) -> Option<Ref<Control>> =>
324                |target: Ref<ResourceDictionary>| Design::get_preview_with(&target.upcast::<FerroObject>()),
325        static fn GetPreviewWith(Rc<dyn IDataTemplate>) -> Option<Ref<Control>> =>
326                |target: Rc<dyn IDataTemplate>| Design::get_preview_with_for_data_template(&target),
327        static fn GetPreviewWith(Rc<dyn IStyle>) -> Option<Ref<Control>> =>
328                |target: Rc<dyn IStyle>| Design::get_preview_with_for_style(&target),
329    ],
330});
331
332ferro_class_info!(Expander {
333    markup: {
334        namespace: "FerroUI.Controls",
335        fields: [
336            CollapsedEvent: RoutedEvent<RoutedEventArgs> => || *Expander::collapsed_event(),
337            CollapsingEvent: RoutedEvent<CancelRoutedEventArgs> => || *Expander::collapsing_event(),
338            ExpandedEvent: RoutedEvent<RoutedEventArgs> => || *Expander::expanded_event(),
339            ExpandingEvent: RoutedEvent<CancelRoutedEventArgs> => || *Expander::expanding_event(),
340        ],
341        attributes: [PseudoClasses(":expanded", ":up", ":down", ":left", ":right")],
342    },
343});
344
345ferro_class_info!(Flyout {
346    markup: {
347        namespace: "FerroUI.Controls",
348        content: Content,
349        properties: [
350            FlyoutPresenterClasses: Classes { get: Flyout::flyout_presenter_classes },
351        ],
352    },
353});
354
355ferro_class_info!(Grid {
356    markup: {
357        namespace: "FerroUI.Controls",
358        properties: [
359            ColumnDefinitions: ColumnDefinitions { get: Grid::column_definitions, set: Grid::set_column_definitions },
360            RowDefinitions: RowDefinitions { get: Grid::row_definitions, set: Grid::set_row_definitions },
361        ],
362    },
363});
364
365ferro_class_info!(HyperlinkButton {
366    markup: {
367        namespace: "FerroUI.Controls",
368        attributes: [PseudoClasses(":visited")],
369    },
370});
371
372ferro_class_info!(Image {
373    markup: {
374        namespace: "FerroUI.Controls",
375        content: Source,
376    },
377});
378
379ferro_class_info!(ItemsControl {
380    markup: {
381        namespace: "FerroUI.Controls",
382        content: Items,
383        properties: [
384            Items: ItemCollection { get: ItemsControl::items },
385        ],
386        property_attributes: [
387            DisplayMemberBinding: [AssignBinding, InheritDataTypeFromItems("ItemsSource")],
388            ItemTemplate: [InheritDataTypeFromItems("ItemsSource")],
389        ],
390        events: [
391            PreparingContainer(Option<BoxedValue>, ContainerPreparedEventArgs) => |this: &Ref<ItemsControl>, handler: MarkupDelegate| {
392                let sender = this.downgrade();
393                this.preparing_container(move |e: &ContainerPreparedEventArgs| {
394                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
395                })
396            },
397            ContainerPrepared(Option<BoxedValue>, ContainerPreparedEventArgs) => |this: &Ref<ItemsControl>, handler: MarkupDelegate| {
398                let sender = this.downgrade();
399                this.container_prepared(move |e: &ContainerPreparedEventArgs| {
400                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
401                })
402            },
403            ContainerIndexChanged(Option<BoxedValue>, ContainerIndexChangedEventArgs) => |this: &Ref<ItemsControl>, handler: MarkupDelegate| {
404                let sender = this.downgrade();
405                this.container_index_changed(move |e: &ContainerIndexChangedEventArgs| {
406                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
407                })
408            },
409            ContainerClearing(Option<BoxedValue>, ContainerClearingEventArgs) => |this: &Ref<ItemsControl>, handler: MarkupDelegate| {
410                let sender = this.downgrade();
411                this.container_clearing(move |e: &ContainerClearingEventArgs| {
412                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
413                })
414            },
415        ],
416        attributes: [PseudoClasses(":empty", ":singleitem")],
417    },
418});
419
420ferro_class_info!(Label {
421    markup: {
422        namespace: "FerroUI.Controls",
423        property_attributes: [
424            Target: [ResolveByName],
425        ],
426    },
427});
428
429ferro_class_info!(ListBoxItem {
430    markup: {
431        namespace: "FerroUI.Controls",
432        attributes: [PseudoClasses(":pressed", ":selected")],
433    },
434});
435
436ferro_class_info!(MenuBase {
437    markup: {
438        namespace: "FerroUI.Controls",
439        fields: [
440            OpenedEvent: RoutedEvent<RoutedEventArgs> => || *MenuBase::opened_event(),
441            ClosedEvent: RoutedEvent<RoutedEventArgs> => || *MenuBase::closed_event(),
442        ],
443    },
444});
445
446ferro_class_info!(MenuItem {
447    markup: {
448        namespace: "FerroUI.Controls",
449        properties: [
450            IsSelected: bool { get: MenuItem::is_selected, set: MenuItem::set_is_selected },
451        ],
452        fields: [
453            ClickEvent: RoutedEvent<RoutedEventArgs> => || *MenuItem::click_event(),
454            PointerEnteredItemEvent: RoutedEvent<RoutedEventArgs> => || *MenuItem::pointer_entered_item_event(),
455            PointerExitedItemEvent: RoutedEvent<RoutedEventArgs> => || *MenuItem::pointer_exited_item_event(),
456            SubmenuOpenedEvent: RoutedEvent<RoutedEventArgs> => || *MenuItem::submenu_opened_event(),
457        ],
458        attributes: [
459            TemplatePart("PART_Popup", type(Ref<Popup>)),
460            PseudoClasses(":separator", ":radio", ":toggle", ":checked", ":icon", ":open", ":pressed", ":selected"),
461        ],
462    },
463});
464
465ferro_class_info!(NativeMenu {
466    markup: {
467        namespace: "FerroUI.Controls",
468        content: Items,
469        properties: [
470            Items: FerroList<Ref<NativeMenuItemBase>> { get: NativeMenu::items },
471        ],
472    },
473});
474
475ferro_class_info!(NativeMenuBar {
476    markup: {
477        namespace: "FerroUI.Controls",
478        attributes: [TemplatePart("PART_NativeMenuPresenter", type(Ref<MenuBase>))],
479    },
480});
481
482// The handler of `Click` takes the sender and empty event arguments in the managed original (`EventHandler`).
483ferro_class_info!(NativeMenuItem {
484    markup: {
485        namespace: "FerroUI.Controls",
486        content: Menu,
487        constructors: [
488            (String) => |header: String| NativeMenuItem::with_header(&header),
489        ],
490        events: [
491            Click(Option<BoxedValue>, EventArgs) => |this: &Ref<NativeMenuItem>, handler: MarkupDelegate| {
492                let sender = this.downgrade();
493                this.click(move |_item: &NativeMenuItem| {
494                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
495                })
496            },
497        ],
498    },
499});
500
501ferro_class_info!(Page {
502    markup: {
503        namespace: "FerroUI.Controls",
504        fields: [
505            PageNavigationSystemBackButtonPressedEvent: RoutedEvent<RoutedEventArgs> => || *Page::page_navigation_system_back_button_pressed_event(),
506        ],
507        events: [
508            NavigatedTo(Option<BoxedValue>, NavigatedToEventArgs) => |this: &Ref<Page>, handler: MarkupDelegate| {
509                let sender = this.downgrade();
510                this.navigated_to(move |e: &NavigatedToEventArgs| {
511                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
512                })
513            },
514            NavigatedFrom(Option<BoxedValue>, NavigatedFromEventArgs) => |this: &Ref<Page>, handler: MarkupDelegate| {
515                let sender = this.downgrade();
516                this.navigated_from(move |e: &NavigatedFromEventArgs| {
517                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
518                })
519            },
520        ],
521    },
522});
523
524ferro_class_info!(Panel {
525    markup: {
526        namespace: "FerroUI.Controls",
527        content: Children,
528        properties: [
529            Children: Controls { get: Panel::children },
530        ],
531    },
532});
533
534ferro_class_info!(RefreshContainer {
535    markup: {
536        namespace: "FerroUI.Controls",
537        fields: [
538            RefreshRequestedEvent: RoutedEvent<RefreshRequestedEventArgs> => || *RefreshContainer::refresh_requested_event(),
539        ],
540    },
541});
542
543ferro_class_info!(RefreshVisualizer {
544    markup: {
545        namespace: "FerroUI.Controls",
546        fields: [
547            RefreshRequestedEvent: RoutedEvent<RefreshRequestedEventArgs> => || *RefreshVisualizer::refresh_requested_event(),
548        ],
549    },
550});
551
552ferro_class_info!(RelativePanel {
553    markup: {
554        namespace: "FerroUI.Controls",
555        property_attributes: [
556            Above: [ResolveByName],
557            AlignBottomWith: [ResolveByName],
558            AlignHorizontalCenterWith: [ResolveByName],
559            AlignLeftWith: [ResolveByName],
560            AlignRightWith: [ResolveByName],
561            AlignTopWith: [ResolveByName],
562            AlignVerticalCenterWith: [ResolveByName],
563            Below: [ResolveByName],
564            LeftOf: [ResolveByName],
565            RightOf: [ResolveByName],
566        ],
567        methods: [
568            static fn GetAlignLeftWith(Ref<FerroObject>) -> Option<BoxedValue> =>
569                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_left_with_property()),
570            static fn SetAlignLeftWith(Ref<FerroObject>, Option<BoxedValue>) =>
571                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::align_left_with_property(), value),
572            static fn GetAlignRightWithPanel(Ref<FerroObject>) -> bool =>
573                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_right_with_panel_property()),
574            static fn SetAlignRightWithPanel(Ref<FerroObject>, bool) =>
575                |element: Ref<FerroObject>, value: bool| element.set_value(RelativePanel::align_right_with_panel_property(), value),
576            static fn GetAlignRightWith(Ref<FerroObject>) -> Option<BoxedValue> =>
577                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_right_with_property()),
578            static fn SetAlignRightWith(Ref<FerroObject>, Option<BoxedValue>) =>
579                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::align_right_with_property(), value),
580            static fn GetAlignTopWithPanel(Ref<FerroObject>) -> bool =>
581                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_top_with_panel_property()),
582            static fn SetAlignTopWithPanel(Ref<FerroObject>, bool) =>
583                |element: Ref<FerroObject>, value: bool| element.set_value(RelativePanel::align_top_with_panel_property(), value),
584            static fn GetAlignTopWith(Ref<FerroObject>) -> Option<BoxedValue> =>
585                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_top_with_property()),
586            static fn SetAlignTopWith(Ref<FerroObject>, Option<BoxedValue>) =>
587                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::align_top_with_property(), value),
588            static fn GetAlignVerticalCenterWithPanel(Ref<FerroObject>) -> bool =>
589                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_vertical_center_with_panel_property()),
590            static fn SetAlignVerticalCenterWithPanel(Ref<FerroObject>, bool) =>
591                |element: Ref<FerroObject>, value: bool| element.set_value(RelativePanel::align_vertical_center_with_panel_property(), value),
592            static fn GetAlignVerticalCenterWith(Ref<FerroObject>) -> Option<BoxedValue> =>
593                |element: Ref<FerroObject>| element.get_value(RelativePanel::align_vertical_center_with_property()),
594            static fn SetAlignVerticalCenterWith(Ref<FerroObject>, Option<BoxedValue>) =>
595                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::align_vertical_center_with_property(), value),
596            static fn GetBelow(Ref<FerroObject>) -> Option<BoxedValue> =>
597                |element: Ref<FerroObject>| element.get_value(RelativePanel::below_property()),
598            static fn SetBelow(Ref<FerroObject>, Option<BoxedValue>) =>
599                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::below_property(), value),
600            static fn GetLeftOf(Ref<FerroObject>) -> Option<BoxedValue> =>
601                |element: Ref<FerroObject>| element.get_value(RelativePanel::left_of_property()),
602            static fn SetLeftOf(Ref<FerroObject>, Option<BoxedValue>) =>
603                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::left_of_property(), value),
604            static fn GetRightOf(Ref<FerroObject>) -> Option<BoxedValue> =>
605                |element: Ref<FerroObject>| element.get_value(RelativePanel::right_of_property()),
606            static fn SetRightOf(Ref<FerroObject>, Option<BoxedValue>) =>
607                |element: Ref<FerroObject>, value: Option<BoxedValue>| element.set_value(RelativePanel::right_of_property(), value),
608        ],
609    },
610});
611
612ferro_class_info!(RowDefinition {
613    markup: {
614        namespace: "FerroUI.Controls",
615        constructors: [
616            (f64, GridUnitType) => RowDefinition::with_value,
617            (GridLength) => RowDefinition::with_height,
618        ],
619    },
620});
621
622ferro_class_info!(SelectingMultiPage {
623    markup: {
624        namespace: "FerroUI.Controls",
625        fields: [
626            SelectionChangedEvent: RoutedEvent<PageSelectionChangedEventArgs> => || *SelectingMultiPage::selection_changed_event(),
627        ],
628    },
629});
630
631ferro_class_info!(Slider {
632    markup: {
633        namespace: "FerroUI.Controls",
634        attributes: [
635            TemplatePart("PART_DecreaseButton", type(Ref<Button>)),
636            TemplatePart("PART_IncreaseButton", type(Ref<Button>)),
637            TemplatePart("PART_Track", type(Ref<Track>)),
638            PseudoClasses(":vertical", ":horizontal", ":pressed"),
639        ],
640    },
641});
642
643ferro_class_info!(Spinner {
644    markup: {
645        namespace: "FerroUI.Controls",
646        fields: [
647            SpinEvent: RoutedEvent<SpinEventArgs> => || *Spinner::spin_event(),
648        ],
649    },
650});
651
652ferro_class_info!(SplitButton {
653    markup: {
654        namespace: "FerroUI.Controls",
655        fields: [
656            ClickEvent: RoutedEvent<RoutedEventArgs> => || *SplitButton::click_event(),
657        ],
658        attributes: [
659            TemplatePart("PART_PrimaryButton", type(Ref<Button>)),
660            TemplatePart("PART_SecondaryButton", type(Ref<Button>)),
661            PseudoClasses(":flyout-open", ":pressed"),
662        ],
663    },
664});
665
666ferro_class_info!(StackPanel {
667    markup: {
668        namespace: "FerroUI.Controls",
669        fields: [
670            HorizontalSnapPointsChangedEvent: RoutedEvent<RoutedEventArgs> => || *StackPanel::horizontal_snap_points_changed_event(),
671            VerticalSnapPointsChangedEvent: RoutedEvent<RoutedEventArgs> => || *StackPanel::vertical_snap_points_changed_event(),
672        ],
673    },
674});
675
676ferro_class_info!(TabControl {
677    markup: {
678        namespace: "FerroUI.Controls",
679        attributes: [
680            TemplatePart("PART_ItemsPresenter", type(Ref<ItemsPresenter>)),
681            TemplatePart("PART_SelectedContentHost", type(Ref<ContentPresenter>)),
682            TemplatePart("PART_SelectedContentHost2", type(Ref<ContentPresenter>)),
683        ],
684    },
685});
686
687ferro_class_info!(TabItem {
688    markup: {
689        namespace: "FerroUI.Controls",
690        attributes: [PseudoClasses(":pressed", ":selected")],
691    },
692});
693
694ferro_class_info!(TableView {
695    markup: {
696        namespace: "FerroUI.Controls",
697        properties: [
698            DisplayMemberBinding: Option<AssignedBinding> { get: TableView::display_member_binding, set: TableView::set_display_member_binding } [AssignBinding, InheritDataTypeFromItems("ItemsSource")],
699            ItemTemplate: Option<Rc<dyn IDataTemplate>> { get: TableView::item_template, set: TableView::set_item_template } [InheritDataTypeFromItems("ItemsSource")],
700        ],
701    },
702});
703
704ferro_class_info!(TextBlock {
705    markup: {
706        namespace: "FerroUI.Controls",
707        content: Inlines,
708        properties: [
709            LayoutRoundingPlacement: TextLayoutRoundingPlacement {
710                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::layout_rounding_placement_property()),
711                set: |this: &Ref<TextBlock>, value: TextLayoutRoundingPlacement| {
712                    this.set_value(TextBlock::layout_rounding_placement_property(), value)
713                }
714            },
715            LineHeight: f64 {
716                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::line_height_property()),
717                set: |this: &Ref<TextBlock>, value: f64| this.set_value(TextBlock::line_height_property(), value)
718            },
719            LineSpacing: f64 {
720                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::line_spacing_property()),
721                set: |this: &Ref<TextBlock>, value: f64| this.set_value(TextBlock::line_spacing_property(), value)
722            },
723            MaxLines: i32 {
724                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::max_lines_property()),
725                set: |this: &Ref<TextBlock>, value: i32| this.set_value(TextBlock::max_lines_property(), value)
726            },
727            TextWrapping: TextWrapping {
728                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::text_wrapping_property()),
729                set: |this: &Ref<TextBlock>, value: TextWrapping| this.set_value(TextBlock::text_wrapping_property(), value)
730            },
731            TextTrimming: Rc<dyn TextTrimming> {
732                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::text_trimming_property()),
733                set: |this: &Ref<TextBlock>, value: Rc<dyn TextTrimming>| this.set_value(TextBlock::text_trimming_property(), value)
734            },
735            TextAlignment: TextAlignment {
736                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::text_alignment_property()),
737                set: |this: &Ref<TextBlock>, value: TextAlignment| this.set_value(TextBlock::text_alignment_property(), value)
738            },
739            BaselineOffset: f64 {
740                get: |this: &Ref<TextBlock>| this.get_value(TextBlock::baseline_offset_property()),
741                set: |this: &Ref<TextBlock>, value: f64| this.set_value(TextBlock::baseline_offset_property(), value)
742            },
743        ],
744    },
745});
746
747ferro_class_info!(TextBox {
748    markup: {
749        namespace: "FerroUI.Controls",
750        content: Text,
751        properties: [
752            SelectedText: String {
753                get: TextBox::selected_text,
754                set: |text_box: &Ref<TextBox>, value: String| text_box.set_selected_text(Some(&value))
755            },
756        ],
757        methods: [
758            fn ClearSelection() => TextBox::clear_selection,
759            fn Cut() => TextBox::cut,
760            fn Copy() => TextBox::copy,
761            fn Paste() => TextBox::paste,
762            fn Clear() => TextBox::clear,
763            fn ScrollToLine(i32) => |text_box: &Ref<TextBox>, line_index: i32| text_box.scroll_to_line(line_index),
764            fn SelectAll() => TextBox::select_all,
765            fn Undo() => TextBox::undo,
766            fn Redo() => TextBox::redo,
767        ],
768        fields: [
769            CopyingToClipboardEvent: RoutedEvent<RoutedEventArgs> => || *TextBox::copying_to_clipboard_event(),
770            CuttingToClipboardEvent: RoutedEvent<RoutedEventArgs> => || *TextBox::cutting_to_clipboard_event(),
771            PastingFromClipboardEvent: RoutedEvent<RoutedEventArgs> => || *TextBox::pasting_from_clipboard_event(),
772            TextChangedEvent: RoutedEvent<TextChangedEventArgs> => || *TextBox::text_changed_event(),
773            TextChangingEvent: RoutedEvent<TextChangingEventArgs> => || *TextBox::text_changing_event(),
774        ],
775        static_properties: [
776            CutGesture: Option<KeyGesture> { get: TextBox::cut_gesture },
777            CopyGesture: Option<KeyGesture> { get: TextBox::copy_gesture },
778            PasteGesture: Option<KeyGesture> { get: TextBox::paste_gesture },
779        ],
780        attributes: [
781            TemplatePart("PART_TextPresenter", type(Ref<TextPresenter>), IsRequired = true),
782            TemplatePart("PART_ScrollViewer", type(Ref<ScrollViewer>)),
783            PseudoClasses(":empty"),
784            PseudoClasses(":touch-mode"),
785        ],
786    },
787});
788
789ferro_class_info!(ToggleSplitButton {
790    markup: {
791        namespace: "FerroUI.Controls",
792        fields: [
793            IsCheckedChangedEvent: RoutedEvent<RoutedEventArgs> => || *ToggleSplitButton::is_checked_changed_event(),
794        ],
795        attributes: [PseudoClasses(":checked")],
796    },
797});
798
799ferro_class_info!(ToolTip {
800    markup: {
801        namespace: "FerroUI.Controls",
802        fields: [
803            ToolTipOpeningEvent: RoutedEvent<CancelRoutedEventArgs> => || *ToolTip::tool_tip_opening_event(),
804            ToolTipClosingEvent: RoutedEvent<RoutedEventArgs> => || *ToolTip::tool_tip_closing_event(),
805        ],
806        attributes: [PseudoClasses(":open")],
807    },
808});
809
810ferro_class_info!(TopLevel {
811    markup: {
812        namespace: "FerroUI.Controls",
813        fields: [
814            BackRequestedEvent: RoutedEvent<RoutedEventArgs> => || *TopLevel::back_requested_event(),
815        ],
816        events: [
817            Opened(Option<BoxedValue>, EventArgs) => |this: &Ref<TopLevel>, handler: MarkupDelegate| {
818                let sender = this.downgrade();
819                this.opened(move || {
820                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
821                })
822            },
823            Closed(Option<BoxedValue>, EventArgs) => |this: &Ref<TopLevel>, handler: MarkupDelegate| {
824                let sender = this.downgrade();
825                this.closed(move || {
826                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
827                })
828            },
829            ScalingChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<TopLevel>, handler: MarkupDelegate| {
830                let sender = this.downgrade();
831                this.scaling_changed(move || {
832                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
833                })
834            },
835        ],
836        attributes: [
837            TemplatePart("PART_TransparencyFallback", type(Ref<Border>)),
838            TemplatePart("PART_VisualLayerManager", type(Ref<VisualLayerManager>)),
839        ],
840    },
841});
842
843ferro_class_info!(TransitioningContentControl {
844    markup: {
845        namespace: "FerroUI.Controls",
846        fields: [
847            TransitionCompletedEvent: RoutedEvent<TransitionCompletedEventArgs> => || *TransitioningContentControl::transition_completed_event(),
848        ],
849    },
850});
851
852ferro_class_info!(TreeViewItem {
853    markup: {
854        namespace: "FerroUI.Controls",
855        fields: [
856            ExpandedEvent: RoutedEvent<RoutedEventArgs> => || *TreeViewItem::expanded_event(),
857            CollapsedEvent: RoutedEvent<RoutedEventArgs> => || *TreeViewItem::collapsed_event(),
858        ],
859        attributes: [TemplatePart("PART_Header", type(Ref<Control>)), PseudoClasses(":pressed", ":selected")],
860    },
861});
862
863ferro_class_info!(Viewbox {
864    markup: {
865        namespace: "FerroUI.Controls",
866        content: Child,
867    },
868});
869
870ferro_class_info!(VirtualizingStackPanel {
871    markup: {
872        namespace: "FerroUI.Controls",
873        fields: [
874            HorizontalSnapPointsChangedEvent: RoutedEvent<RoutedEventArgs> => || *VirtualizingStackPanel::horizontal_snap_points_changed_event(),
875            VerticalSnapPointsChangedEvent: RoutedEvent<RoutedEventArgs> => || *VirtualizingStackPanel::vertical_snap_points_changed_event(),
876        ],
877    },
878});
879
880ferro_class_info!(Window {
881    markup: {
882        namespace: "FerroUI.Controls",
883        properties: [
884            SystemDecorations: WindowDecorations { get: Window::system_decorations, set: Window::set_system_decorations } [Obsolete("Use WindowDecorations instead.")],
885            Position: PixelPoint { get: Window::position, set: Window::set_position },
886        ],
887        fields: [
888            WindowClosedEvent: RoutedEvent<RoutedEventArgs> => || *Window::window_closed_event(),
889            WindowOpenedEvent: RoutedEvent<RoutedEventArgs> => || *Window::window_opened_event(),
890        ],
891        events: [
892            Closing(Option<BoxedValue>, WindowClosingEventArgs) => |this: &Ref<Window>, handler: MarkupDelegate| {
893                let sender = this.downgrade();
894                this.closing(move |e: &WindowClosingEventArgs| {
895                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
896                })
897            },
898        ],
899    },
900});
901
902ferro_class_info!(WindowBase {
903    markup: {
904        namespace: "FerroUI.Controls",
905        methods: [
906            fn Activate() => |window: &Ref<WindowBase>| window.activate(),
907            fn Hide() => |window: &Ref<WindowBase>| window.hide(),
908            fn Show() => |window: &Ref<WindowBase>| window.show(),
909        ],
910        events: [
911            Activated(Option<BoxedValue>, EventArgs) => |this: &Ref<WindowBase>, handler: MarkupDelegate| {
912                let sender = this.downgrade();
913                this.activated(move || {
914                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
915                })
916            },
917            Deactivated(Option<BoxedValue>, EventArgs) => |this: &Ref<WindowBase>, handler: MarkupDelegate| {
918                let sender = this.downgrade();
919                this.deactivated(move || {
920                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
921                })
922            },
923            PositionChanged(Option<BoxedValue>, PixelPointEventArgs) => |this: &Ref<WindowBase>, handler: MarkupDelegate| {
924                let sender = this.downgrade();
925                this.position_changed(move |e: &PixelPointEventArgs| {
926                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
927                })
928            },
929            Resized(Option<BoxedValue>, WindowResizedEventArgs) => |this: &Ref<WindowBase>, handler: MarkupDelegate| {
930                let sender = this.downgrade();
931                this.resized(move |e: &WindowResizedEventArgs| {
932                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
933                })
934            },
935        ],
936    },
937});
938
939// FerroUI.Controls.Automation.Peers
940
941ferro_class_info!(EmbeddableControlRootAutomationPeer {
942    markup: {
943        namespace: "FerroUI.Controls.Automation.Peers",
944        events: [
945            FocusChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<EmbeddableControlRootAutomationPeer>, handler: MarkupDelegate| {
946                let sender = this.downgrade();
947                this.focus_changed(move || {
948                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
949                })
950            },
951        ],
952    },
953});
954
955// FerroUI.Controls.Chrome
956
957ferro_class_info!(WindowDrawnDecorations {
958    markup: {
959        namespace: "FerroUI.Controls.Chrome",
960        properties: [
961            TitleBarDecorations: TitleBarDecorations {
962                get: |this: &Ref<WindowDrawnDecorations>| this.get_value(WindowDrawnDecorations::title_bar_decorations_property()),
963                set: |this: &Ref<WindowDrawnDecorations>, value: TitleBarDecorations| this.set_value(WindowDrawnDecorations::title_bar_decorations_property(), value)
964            },
965        ],
966        attributes: [
967            TemplatePart("PART_CloseButton", type(Ref<Button>)),
968            TemplatePart("PART_MinimizeButton", type(Ref<Button>)),
969            TemplatePart("PART_MaximizeButton", type(Ref<Button>)),
970            TemplatePart("PART_FullScreenButton", type(Ref<Button>)),
971            TemplatePart("PART_PopoverCloseButton", type(Ref<Button>)),
972            TemplatePart("PART_PopoverFullScreenButton", type(Ref<Button>)),
973            TemplatePart("PART_TitleBar", type(Ref<Panel>)),
974        ],
975    },
976});
977
978ferro_class_info!(WindowDrawnDecorationsContent {
979    markup: {
980        namespace: "FerroUI.Controls.Chrome",
981        properties: [
982            Overlay: Option<Ref<Control>> {
983                get: WindowDrawnDecorationsContent::overlay,
984                set: |content: &Ref<WindowDrawnDecorationsContent>, value: Option<Ref<Control>>| content.set_overlay(value)
985            },
986            Underlay: Option<Ref<Control>> {
987                get: WindowDrawnDecorationsContent::underlay,
988                set: |content: &Ref<WindowDrawnDecorationsContent>, value: Option<Ref<Control>>| content.set_underlay(value)
989            },
990            FullscreenPopover: Option<Ref<Control>> {
991                get: WindowDrawnDecorationsContent::fullscreen_popover,
992                set: |content: &Ref<WindowDrawnDecorationsContent>, value: Option<Ref<Control>>| {
993                    content.set_fullscreen_popover(value)
994                }
995            },
996        ],
997    },
998});
999
1000// FerroUI.Controls.Documents
1001
1002ferro_class_info!(Inline {
1003    markup: {
1004        namespace: "FerroUI.Controls.Documents",
1005        properties: [
1006            TextDecorations: Option<TextDecorationCollection> {
1007                get: |this: &Ref<Inline>| this.get_value(Inline::text_decorations_property()),
1008                set: |this: &Ref<Inline>, value: Option<TextDecorationCollection>| this.set_value(Inline::text_decorations_property(), value)
1009            },
1010        ],
1011        methods: [
1012            static fn GetTextDecorations(Ref<Control>) -> Option<TextDecorationCollection> =>
1013                |element: Ref<Control>| element.get_value(Inline::text_decorations_property()),
1014            static fn SetTextDecorations(Ref<Control>, Option<TextDecorationCollection>) =>
1015                |element: Ref<Control>, value: Option<TextDecorationCollection>| element.set_value(Inline::text_decorations_property(), value),
1016        ],
1017    },
1018});
1019
1020ferro_class_info!(InlineUIContainer {
1021    markup: {
1022        namespace: "FerroUI.Controls.Documents",
1023        content: Child,
1024        constructors: [
1025            (Ref<Control>) => |child: Ref<Control>| InlineUIContainer::with_child(child),
1026        ],
1027    },
1028});
1029
1030ferro_class_info!(LineBreak {
1031    markup: {
1032        namespace: "FerroUI.Controls.Documents",
1033        attributes: [TrimSurroundingWhitespace],
1034    },
1035});
1036
1037ferro_class_info!(Run {
1038    markup: {
1039        namespace: "FerroUI.Controls.Documents",
1040        content: Text,
1041        constructors: [
1042            (Option<String>) => |text: Option<String>| Run::with_text(text.as_deref()),
1043        ],
1044    },
1045});
1046
1047ferro_class_info!(Span {
1048    markup: {
1049        namespace: "FerroUI.Controls.Documents",
1050        content: Inlines,
1051    },
1052});
1053
1054ferro_class_info!(TextElement {
1055    markup: {
1056        namespace: "FerroUI.Controls.Documents",
1057        properties: [
1058            FontFamily: FontFamily {
1059                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_family_property()),
1060                set: |this: &Ref<TextElement>, value: FontFamily| this.set_value(TextElement::font_family_property(), value)
1061            },
1062            FontFeatures: Option<FontFeatureCollection> {
1063                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_features_property()),
1064                set: |this: &Ref<TextElement>, value: Option<FontFeatureCollection>| this.set_value(TextElement::font_features_property(), value)
1065            },
1066            FontSize: f64 {
1067                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_size_property()),
1068                set: |this: &Ref<TextElement>, value: f64| this.set_value(TextElement::font_size_property(), value)
1069            },
1070            FontStyle: FontStyle {
1071                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_style_property()),
1072                set: |this: &Ref<TextElement>, value: FontStyle| this.set_value(TextElement::font_style_property(), value)
1073            },
1074            FontWeight: FontWeight {
1075                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_weight_property()),
1076                set: |this: &Ref<TextElement>, value: FontWeight| this.set_value(TextElement::font_weight_property(), value)
1077            },
1078            FontStretch: FontStretch {
1079                get: |this: &Ref<TextElement>| this.get_value(TextElement::font_stretch_property()),
1080                set: |this: &Ref<TextElement>, value: FontStretch| this.set_value(TextElement::font_stretch_property(), value)
1081            },
1082            Foreground: Option<Rc<dyn IBrush>> {
1083                get: |this: &Ref<TextElement>| this.get_value(TextElement::foreground_property()),
1084                set: |this: &Ref<TextElement>, value: Option<Rc<dyn IBrush>>| this.set_value(TextElement::foreground_property(), value)
1085            },
1086            LetterSpacing: f64 {
1087                get: |this: &Ref<TextElement>| this.get_value(TextElement::letter_spacing_property()),
1088                set: |this: &Ref<TextElement>, value: f64| this.set_value(TextElement::letter_spacing_property(), value)
1089            },
1090        ],
1091        methods: [
1092            static fn GetFontFamily(Ref<Control>) -> FontFamily =>
1093                |element: Ref<Control>| element.get_value(TextElement::font_family_property()),
1094            static fn SetFontFamily(Ref<Control>, FontFamily) =>
1095                |element: Ref<Control>, value: FontFamily| element.set_value(TextElement::font_family_property(), value),
1096            static fn GetFontFeatures(Ref<Control>) -> Option<FontFeatureCollection> =>
1097                |element: Ref<Control>| element.get_value(TextElement::font_features_property()),
1098            static fn SetFontFeatures(Ref<Control>, Option<FontFeatureCollection>) =>
1099                |element: Ref<Control>, value: Option<FontFeatureCollection>| element.set_value(TextElement::font_features_property(), value),
1100            static fn GetFontSize(Ref<Control>) -> f64 =>
1101                |element: Ref<Control>| element.get_value(TextElement::font_size_property()),
1102            static fn SetFontSize(Ref<Control>, f64) =>
1103                |element: Ref<Control>, value: f64| element.set_value(TextElement::font_size_property(), value),
1104            static fn GetFontStyle(Ref<Control>) -> FontStyle =>
1105                |element: Ref<Control>| element.get_value(TextElement::font_style_property()),
1106            static fn SetFontStyle(Ref<Control>, FontStyle) =>
1107                |element: Ref<Control>, value: FontStyle| element.set_value(TextElement::font_style_property(), value),
1108            static fn GetFontWeight(Ref<Control>) -> FontWeight =>
1109                |element: Ref<Control>| element.get_value(TextElement::font_weight_property()),
1110            static fn SetFontWeight(Ref<Control>, FontWeight) =>
1111                |element: Ref<Control>, value: FontWeight| element.set_value(TextElement::font_weight_property(), value),
1112            static fn GetFontStretch(Ref<Control>) -> FontStretch =>
1113                |element: Ref<Control>| element.get_value(TextElement::font_stretch_property()),
1114            static fn SetFontStretch(Ref<Control>, FontStretch) =>
1115                |element: Ref<Control>, value: FontStretch| element.set_value(TextElement::font_stretch_property(), value),
1116            static fn GetForeground(Ref<Control>) -> Option<Rc<dyn IBrush>> =>
1117                |element: Ref<Control>| element.get_value(TextElement::foreground_property()),
1118            static fn SetForeground(Ref<Control>, Option<Rc<dyn IBrush>>) =>
1119                |element: Ref<Control>, value: Option<Rc<dyn IBrush>>| element.set_value(TextElement::foreground_property(), value),
1120        ],
1121    },
1122});
1123
1124// FerroUI.Controls.Presenters
1125
1126ferro_class_info!(ContentPresenter {
1127    markup: {
1128        namespace: "FerroUI.Controls.Presenters",
1129        content: Content,
1130        property_attributes: [
1131            Content: [DependsOn("ContentTemplate")],
1132        ],
1133        attributes: [PseudoClasses(":empty")],
1134    },
1135});
1136
1137ferro_class_info!(TextPresenter {
1138    markup: {
1139        namespace: "FerroUI.Controls.Presenters",
1140        content: Text,
1141        properties: [
1142            FontFamily: FontFamily { get: TextPresenter::font_family, set: TextPresenter::set_font_family },
1143            FontFeatures: Option<FontFeatureCollection> { get: TextPresenter::font_features, set: TextPresenter::set_font_features },
1144            FontSize: f64 { get: TextPresenter::font_size, set: TextPresenter::set_font_size },
1145            FontStyle: FontStyle { get: TextPresenter::font_style, set: TextPresenter::set_font_style },
1146            FontWeight: FontWeight { get: TextPresenter::font_weight, set: TextPresenter::set_font_weight },
1147            FontStretch: FontStretch { get: TextPresenter::font_stretch, set: TextPresenter::set_font_stretch },
1148            Foreground: Option<Rc<dyn IBrush>> { get: TextPresenter::foreground, set: TextPresenter::set_foreground },
1149        ],
1150        events: [
1151            CaretBoundsChanged(Option<BoxedValue>, EventArgs) => |this: &Ref<TextPresenter>, handler: MarkupDelegate| {
1152                let sender = this.downgrade();
1153                this.caret_bounds_changed(move || {
1154                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1155                })
1156            },
1157        ],
1158    },
1159});
1160
1161// FerroUI.Controls.Primitives
1162
1163ferro_class_info!(FlyoutBase {
1164    markup: {
1165        namespace: "FerroUI.Controls.Primitives",
1166        events: [
1167            Opened(Option<BoxedValue>, EventArgs) => |this: &Ref<FlyoutBase>, handler: MarkupDelegate| {
1168                let sender = this.downgrade();
1169                this.opened(move || {
1170                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1171                })
1172            },
1173            Closed(Option<BoxedValue>, EventArgs) => |this: &Ref<FlyoutBase>, handler: MarkupDelegate| {
1174                let sender = this.downgrade();
1175                this.closed(move || {
1176                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1177                })
1178            },
1179        ],
1180    },
1181});
1182
1183ferro_class_info!(HeaderedContentControl {
1184    markup: {
1185        namespace: "FerroUI.Controls.Primitives",
1186        attributes: [TemplatePart("PART_HeaderPresenter", type(Ref<ContentPresenter>))],
1187    },
1188});
1189
1190ferro_class_info!(HeaderedItemsControl {
1191    markup: {
1192        namespace: "FerroUI.Controls.Primitives",
1193        attributes: [TemplatePart("PART_HeaderPresenter", type(Ref<ContentPresenter>))],
1194    },
1195});
1196
1197ferro_class_info!(PickerPresenterBase {
1198    markup: {
1199        namespace: "FerroUI.Controls.Primitives",
1200        events: [
1201            Confirmed(Option<BoxedValue>, EventArgs) => |this: &Ref<PickerPresenterBase>, handler: MarkupDelegate| {
1202                let sender = this.downgrade();
1203                this.confirmed(move || {
1204                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1205                })
1206            },
1207            Dismissed(Option<BoxedValue>, EventArgs) => |this: &Ref<PickerPresenterBase>, handler: MarkupDelegate| {
1208                let sender = this.downgrade();
1209                this.dismissed(move || {
1210                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1211                })
1212            },
1213        ],
1214    },
1215});
1216
1217ferro_class_info!(Popup {
1218    markup: {
1219        namespace: "FerroUI.Controls.Primitives",
1220        content: Child,
1221        properties: [
1222            DependencyResolver: Option<Rc<dyn IFerroDependencyResolver>> { set: Popup::set_dependency_resolver },
1223            TakesFocusFromNativeControl: bool {
1224                get: |this: &Ref<Popup>| this.get_value(Popup::takes_focus_from_native_control_property()),
1225                set: |this: &Ref<Popup>, value: bool| this.set_value(Popup::takes_focus_from_native_control_property(), value)
1226            },
1227        ],
1228        property_attributes: [
1229            PlacementTarget: [ResolveByName],
1230        ],
1231        events: [
1232            Closed(Option<BoxedValue>, EventArgs) => |this: &Ref<Popup>, handler: MarkupDelegate| {
1233                let sender = this.downgrade();
1234                this.closed(move || {
1235                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1236                })
1237            },
1238            Opened(Option<BoxedValue>, EventArgs) => |this: &Ref<Popup>, handler: MarkupDelegate| {
1239                let sender = this.downgrade();
1240                this.opened(move || {
1241                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(EventArgs::EMPTY)]);
1242                })
1243            },
1244        ],
1245    },
1246});
1247
1248ferro_class_info!(PopupFlyoutBase {
1249    markup: {
1250        namespace: "FerroUI.Controls.Primitives",
1251        events: [
1252            Closing(Option<BoxedValue>, CancelEventArgs) => |this: &Ref<PopupFlyoutBase>, handler: MarkupDelegate| {
1253                let sender = this.downgrade();
1254                this.closing(move |e: &CancelEventArgs| {
1255                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
1256                })
1257            },
1258            Opening(Option<BoxedValue>, EventArgs) => |this: &Ref<PopupFlyoutBase>, handler: MarkupDelegate| {
1259                let sender = this.downgrade();
1260                this.opening(move |e: &CancelEventArgs| {
1261                    handler.invoke(&[into_markup_value(sender.upgrade()), into_markup_value(e.clone())]);
1262                })
1263            },
1264        ],
1265    },
1266});
1267
1268ferro_class_info!(RangeBase {
1269    markup: {
1270        namespace: "FerroUI.Controls.Primitives",
1271        fields: [
1272            ValueChangedEvent: RoutedEvent<RangeBaseValueChangedEventArgs> => || *RangeBase::value_changed_event(),
1273        ],
1274    },
1275});
1276
1277ferro_class_info!(SelectingItemsControl {
1278    markup: {
1279        namespace: "FerroUI.Controls.Primitives",
1280        property_attributes: [
1281            SelectedValueBinding: [AssignBinding, InheritDataTypeFromItems("ItemsSource")],
1282        ],
1283        fields: [
1284            IsSelectedChangedEvent: RoutedEvent<RoutedEventArgs> => || *SelectingItemsControl::is_selected_changed_event(),
1285            SelectionChangedEvent: RoutedEvent<SelectionChangedEventArgs> => || *SelectingItemsControl::selection_changed_event(),
1286        ],
1287    },
1288});
1289
1290ferro_class_info!(TemplatedControl {
1291    markup: {
1292        namespace: "FerroUI.Controls.Primitives",
1293        fields: [
1294            TemplateAppliedEvent: RoutedEvent<TemplateAppliedEventArgs> => || *TemplatedControl::template_applied_event(),
1295        ],
1296    },
1297});
1298
1299ferro_class_info!(Thumb {
1300    markup: {
1301        namespace: "FerroUI.Controls.Primitives",
1302        fields: [
1303            DragStartedEvent: RoutedEvent<VectorEventArgs> => || *Thumb::drag_started_event(),
1304            DragDeltaEvent: RoutedEvent<VectorEventArgs> => || *Thumb::drag_delta_event(),
1305            DragCompletedEvent: RoutedEvent<VectorEventArgs> => || *Thumb::drag_completed_event(),
1306        ],
1307        attributes: [PseudoClasses(":pressed")],
1308    },
1309});
1310
1311ferro_class_info!(ToggleButton {
1312    markup: {
1313        namespace: "FerroUI.Controls.Primitives",
1314        fields: [
1315            IsCheckedChangedEvent: RoutedEvent<RoutedEventArgs> => || *ToggleButton::is_checked_changed_event(),
1316        ],
1317        attributes: [PseudoClasses(":checked", ":unchecked", ":indeterminate")],
1318    },
1319});
1320
1321ferro_class_info!(Track {
1322    markup: {
1323        namespace: "FerroUI.Controls.Primitives",
1324        content: Thumb,
1325        attributes: [PseudoClasses(":vertical", ":horizontal")],
1326    },
1327});
1328
1329ferro_class_info!(VisualLayerManager {
1330    markup: {
1331        namespace: "FerroUI.Controls.Primitives",
1332        properties: [
1333            EnableAdornerLayer: bool { get: VisualLayerManager::enable_adorner_layer, set: VisualLayerManager::set_enable_adorner_layer },
1334            EnableOverlayLayer: bool { get: VisualLayerManager::enable_overlay_layer, set: VisualLayerManager::set_enable_overlay_layer },
1335            EnableTextSelectorLayer: bool { get: VisualLayerManager::enable_text_selector_layer, set: VisualLayerManager::set_enable_text_selector_layer },
1336        ],
1337    },
1338});
1339
1340// FerroUI.Controls.PullToRefresh
1341
1342ferro_class_info!(RefreshInfoProvider {
1343    markup: {
1344        namespace: "FerroUI.Controls.PullToRefresh",
1345        fields: [
1346            RefreshStartedEvent: RoutedEvent<RoutedEventArgs> => || *RefreshInfoProvider::refresh_started_event(),
1347            RefreshCompletedEvent: RoutedEvent<RoutedEventArgs> => || *RefreshInfoProvider::refresh_completed_event(),
1348        ],
1349    },
1350});
1351
1352ferro_class_info!(ScrollablePullGestureRecognizer {
1353    markup: {
1354        namespace: "FerroUI.Controls.PullToRefresh",
1355        properties: [
1356            IsMouseEnabled: bool { get: ScrollablePullGestureRecognizer::is_mouse_enabled, set: ScrollablePullGestureRecognizer::set_is_mouse_enabled },
1357        ],
1358    },
1359});
1360
1361// FerroUI.Interactivity
1362
1363/// Carries the metadata of `RoutedEvent<TEventArgs>` for the arguments of this crate.
1364pub(crate) struct RoutedEventOf<TEventArgs>(std::marker::PhantomData<TEventArgs>);
1365
1366ferro_markup_type!(class RoutedEventOf<CancelRoutedEventArgs> as "RoutedEvent`1" {
1367    namespace: "FerroUI.Interactivity",
1368    handles: [RoutedEvent<CancelRoutedEventArgs>, Option<RoutedEvent<CancelRoutedEventArgs>>],
1369    base: RoutedEvent,
1370    generic: "RoutedEvent`1" [CancelRoutedEventArgs],
1371});
1372
1373ferro_markup_type!(class RoutedEventOf<PageSelectionChangedEventArgs> as "RoutedEvent`1" {
1374    namespace: "FerroUI.Interactivity",
1375    handles: [RoutedEvent<PageSelectionChangedEventArgs>, Option<RoutedEvent<PageSelectionChangedEventArgs>>],
1376    base: RoutedEvent,
1377    generic: "RoutedEvent`1" [PageSelectionChangedEventArgs],
1378});
1379
1380ferro_markup_type!(class RoutedEventOf<RangeBaseValueChangedEventArgs> as "RoutedEvent`1" {
1381    namespace: "FerroUI.Interactivity",
1382    handles: [RoutedEvent<RangeBaseValueChangedEventArgs>, Option<RoutedEvent<RangeBaseValueChangedEventArgs>>],
1383    base: RoutedEvent,
1384    generic: "RoutedEvent`1" [RangeBaseValueChangedEventArgs],
1385});
1386
1387ferro_markup_type!(class RoutedEventOf<RefreshRequestedEventArgs> as "RoutedEvent`1" {
1388    namespace: "FerroUI.Interactivity",
1389    handles: [RoutedEvent<RefreshRequestedEventArgs>, Option<RoutedEvent<RefreshRequestedEventArgs>>],
1390    base: RoutedEvent,
1391    generic: "RoutedEvent`1" [RefreshRequestedEventArgs],
1392});
1393
1394ferro_markup_type!(class RoutedEventOf<RequestBringIntoViewEventArgs> as "RoutedEvent`1" {
1395    namespace: "FerroUI.Interactivity",
1396    handles: [RoutedEvent<RequestBringIntoViewEventArgs>, Option<RoutedEvent<RequestBringIntoViewEventArgs>>],
1397    base: RoutedEvent,
1398    generic: "RoutedEvent`1" [RequestBringIntoViewEventArgs],
1399});
1400
1401ferro_markup_type!(class RoutedEventOf<SelectionChangedEventArgs> as "RoutedEvent`1" {
1402    namespace: "FerroUI.Interactivity",
1403    handles: [RoutedEvent<SelectionChangedEventArgs>, Option<RoutedEvent<SelectionChangedEventArgs>>],
1404    base: RoutedEvent,
1405    generic: "RoutedEvent`1" [SelectionChangedEventArgs],
1406});
1407
1408ferro_markup_type!(class RoutedEventOf<SizeChangedEventArgs> as "RoutedEvent`1" {
1409    namespace: "FerroUI.Interactivity",
1410    handles: [RoutedEvent<SizeChangedEventArgs>, Option<RoutedEvent<SizeChangedEventArgs>>],
1411    base: RoutedEvent,
1412    generic: "RoutedEvent`1" [SizeChangedEventArgs],
1413});
1414
1415ferro_markup_type!(class RoutedEventOf<SpinEventArgs> as "RoutedEvent`1" {
1416    namespace: "FerroUI.Interactivity",
1417    handles: [RoutedEvent<SpinEventArgs>, Option<RoutedEvent<SpinEventArgs>>],
1418    base: RoutedEvent,
1419    generic: "RoutedEvent`1" [SpinEventArgs],
1420});
1421
1422ferro_markup_type!(class RoutedEventOf<TemplateAppliedEventArgs> as "RoutedEvent`1" {
1423    namespace: "FerroUI.Interactivity",
1424    handles: [RoutedEvent<TemplateAppliedEventArgs>, Option<RoutedEvent<TemplateAppliedEventArgs>>],
1425    base: RoutedEvent,
1426    generic: "RoutedEvent`1" [TemplateAppliedEventArgs],
1427});
1428
1429ferro_markup_type!(class RoutedEventOf<TextChangedEventArgs> as "RoutedEvent`1" {
1430    namespace: "FerroUI.Interactivity",
1431    handles: [RoutedEvent<TextChangedEventArgs>, Option<RoutedEvent<TextChangedEventArgs>>],
1432    base: RoutedEvent,
1433    generic: "RoutedEvent`1" [TextChangedEventArgs],
1434});
1435
1436ferro_markup_type!(class RoutedEventOf<TextChangingEventArgs> as "RoutedEvent`1" {
1437    namespace: "FerroUI.Interactivity",
1438    handles: [RoutedEvent<TextChangingEventArgs>, Option<RoutedEvent<TextChangingEventArgs>>],
1439    base: RoutedEvent,
1440    generic: "RoutedEvent`1" [TextChangingEventArgs],
1441});
1442
1443ferro_markup_type!(class RoutedEventOf<TransitionCompletedEventArgs> as "RoutedEvent`1" {
1444    namespace: "FerroUI.Interactivity",
1445    handles: [RoutedEvent<TransitionCompletedEventArgs>, Option<RoutedEvent<TransitionCompletedEventArgs>>],
1446    base: RoutedEvent,
1447    generic: "RoutedEvent`1" [TransitionCompletedEventArgs],
1448});
1449
1450ferro_markup_type!(class RoutedEventOf<VectorEventArgs> as "RoutedEvent`1" {
1451    namespace: "FerroUI.Interactivity",
1452    handles: [RoutedEvent<VectorEventArgs>, Option<RoutedEvent<VectorEventArgs>>],
1453    base: RoutedEvent,
1454    generic: "RoutedEvent`1" [VectorEventArgs],
1455});
1456
1457// The typed arguments of routed events.
1458
1459/// The arguments of a routed event as the typed arguments `T`.
1460fn typed_event_args<T: 'static, R>(e: &Rc<dyn IRoutedEventArgs>, f: impl FnOnce(&T) -> R) -> Result<R, String> {
1461    match e.query_args(std::any::TypeId::of::<T>()).and_then(|args| args.downcast_ref::<T>()) {
1462        Some(args) => Ok(f(args)),
1463        None => Err(format!("The arguments are not {}.", std::any::type_name::<T>())),
1464    }
1465}
1466
1467ferro_markup_type!(class PageSelectionChangedEventArgs {
1468    namespace: "FerroUI.Controls",
1469    handles: [PageSelectionChangedEventArgs],
1470    this: Rc<dyn IRoutedEventArgs>,
1471    base: Rc<dyn IRoutedEventArgs>,
1472    properties: [
1473        PreviousPage: Option<Ref<Page>> {
1474            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PageSelectionChangedEventArgs, _>(e, |e| e.previous_page())
1475        },
1476        CurrentPage: Option<Ref<Page>> {
1477            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<PageSelectionChangedEventArgs, _>(e, |e| e.current_page())
1478        },
1479    ],
1480});
1481
1482ferro_markup_type!(class RangeBaseValueChangedEventArgs {
1483    namespace: "FerroUI.Controls.Primitives",
1484    handles: [RangeBaseValueChangedEventArgs],
1485    this: Rc<dyn IRoutedEventArgs>,
1486    base: Rc<dyn IRoutedEventArgs>,
1487    properties: [
1488        OldValue: f64 {
1489            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<RangeBaseValueChangedEventArgs, _>(e, |e| e.old_value())
1490        },
1491        NewValue: f64 {
1492            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<RangeBaseValueChangedEventArgs, _>(e, |e| e.new_value())
1493        },
1494    ],
1495});
1496
1497ferro_markup_type!(class RefreshRequestedEventArgs {
1498    namespace: "FerroUI.Controls",
1499    handles: [RefreshRequestedEventArgs],
1500    this: Rc<dyn IRoutedEventArgs>,
1501    base: Rc<dyn IRoutedEventArgs>,
1502});
1503
1504ferro_markup_type!(class RequestBringIntoViewEventArgs {
1505    namespace: "FerroUI.Controls",
1506    handles: [RequestBringIntoViewEventArgs],
1507    this: Rc<dyn IRoutedEventArgs>,
1508    base: Rc<dyn IRoutedEventArgs>,
1509    properties: [
1510        TargetRect: Rect {
1511            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<RequestBringIntoViewEventArgs, _>(e, |e| e.target_rect()),
1512            try_set: |e: &Rc<dyn IRoutedEventArgs>, value: Rect| typed_event_args::<RequestBringIntoViewEventArgs, _>(e, |e| e.set_target_rect(value))
1513        },
1514    ],
1515});
1516
1517ferro_markup_type!(class SelectionChangedEventArgs {
1518    namespace: "FerroUI.Controls",
1519    handles: [SelectionChangedEventArgs],
1520    this: Rc<dyn IRoutedEventArgs>,
1521    base: Rc<dyn IRoutedEventArgs>,
1522});
1523
1524ferro_markup_type!(class SizeChangedEventArgs {
1525    namespace: "FerroUI.Controls",
1526    handles: [SizeChangedEventArgs],
1527    this: Rc<dyn IRoutedEventArgs>,
1528    base: Rc<dyn IRoutedEventArgs>,
1529    properties: [
1530        HeightChanged: bool {
1531            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SizeChangedEventArgs, _>(e, |e| e.height_changed())
1532        },
1533        NewSize: Size {
1534            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SizeChangedEventArgs, _>(e, |e| e.new_size())
1535        },
1536        PreviousSize: Size {
1537            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SizeChangedEventArgs, _>(e, |e| e.previous_size())
1538        },
1539        WidthChanged: bool {
1540            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SizeChangedEventArgs, _>(e, |e| e.width_changed())
1541        },
1542    ],
1543});
1544
1545ferro_markup_type!(class SpinEventArgs {
1546    namespace: "FerroUI.Controls",
1547    handles: [SpinEventArgs],
1548    this: Rc<dyn IRoutedEventArgs>,
1549    base: Rc<dyn IRoutedEventArgs>,
1550    properties: [
1551        UsingMouseWheel: bool {
1552            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<SpinEventArgs, _>(e, |e| e.using_mouse_wheel())
1553        },
1554    ],
1555});
1556
1557ferro_markup_type!(class TemplateAppliedEventArgs {
1558    namespace: "FerroUI.Controls.Primitives",
1559    handles: [TemplateAppliedEventArgs],
1560    this: Rc<dyn IRoutedEventArgs>,
1561    base: Rc<dyn IRoutedEventArgs>,
1562});
1563
1564ferro_markup_type!(class TextChangedEventArgs {
1565    namespace: "FerroUI.Controls",
1566    handles: [TextChangedEventArgs],
1567    this: Rc<dyn IRoutedEventArgs>,
1568    base: Rc<dyn IRoutedEventArgs>,
1569});
1570
1571ferro_markup_type!(class TextChangingEventArgs {
1572    namespace: "FerroUI.Controls",
1573    handles: [TextChangingEventArgs],
1574    this: Rc<dyn IRoutedEventArgs>,
1575    base: Rc<dyn IRoutedEventArgs>,
1576});
1577
1578ferro_markup_type!(class TransitionCompletedEventArgs {
1579    namespace: "FerroUI.Controls",
1580    handles: [TransitionCompletedEventArgs],
1581    this: Rc<dyn IRoutedEventArgs>,
1582    base: Rc<dyn IRoutedEventArgs>,
1583    properties: [
1584        HasRunToCompletion: bool {
1585            try_get: |e: &Rc<dyn IRoutedEventArgs>| typed_event_args::<TransitionCompletedEventArgs, _>(e, |e| e.has_run_to_completion())
1586        },
1587    ],
1588});
1589
1590/// Registers the casts of the typed routed events declared in this file to the
1591/// untyped routed event, with the untyped value conversions of the current thread.
1592pub(super) fn register_value_types() {
1593    ValueTypes::register_cast::<RoutedEvent<CancelRoutedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1594    ValueTypes::register_cast::<RoutedEvent<PageSelectionChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1595    ValueTypes::register_cast::<RoutedEvent<RangeBaseValueChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1596    ValueTypes::register_cast::<RoutedEvent<RefreshRequestedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1597    ValueTypes::register_cast::<RoutedEvent<RequestBringIntoViewEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1598    ValueTypes::register_cast::<RoutedEvent<SelectionChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1599    ValueTypes::register_cast::<RoutedEvent<SizeChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1600    ValueTypes::register_cast::<RoutedEvent<SpinEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1601    ValueTypes::register_cast::<RoutedEvent<TemplateAppliedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1602    ValueTypes::register_cast::<RoutedEvent<TextChangedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1603    ValueTypes::register_cast::<RoutedEvent<TextChangingEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1604    ValueTypes::register_cast::<RoutedEvent<TransitionCompletedEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1605    ValueTypes::register_cast::<RoutedEvent<VectorEventArgs>, RoutedEvent>(|event| event.as_routed_event());
1606}
1607
1608/// The types declared in this file that are not classes: the types that own static
1609/// members only and the typed routed events. (The metadata of a class is reached
1610/// from its runtime type and needs no registration.)
1611pub(super) const TYPES: &[&MarkupType] = &[
1612    <Design as MarkupTyped>::MARKUP,
1613    <RoutedEventOf<CancelRoutedEventArgs> as MarkupTyped>::MARKUP,
1614    <RoutedEventOf<PageSelectionChangedEventArgs> as MarkupTyped>::MARKUP,
1615    <RoutedEventOf<RangeBaseValueChangedEventArgs> as MarkupTyped>::MARKUP,
1616    <RoutedEventOf<RefreshRequestedEventArgs> as MarkupTyped>::MARKUP,
1617    <RoutedEventOf<RequestBringIntoViewEventArgs> as MarkupTyped>::MARKUP,
1618    <RoutedEventOf<SelectionChangedEventArgs> as MarkupTyped>::MARKUP,
1619    <RoutedEventOf<SizeChangedEventArgs> as MarkupTyped>::MARKUP,
1620    <RoutedEventOf<SpinEventArgs> as MarkupTyped>::MARKUP,
1621    <RoutedEventOf<TemplateAppliedEventArgs> as MarkupTyped>::MARKUP,
1622    <RoutedEventOf<TextChangedEventArgs> as MarkupTyped>::MARKUP,
1623    <RoutedEventOf<TextChangingEventArgs> as MarkupTyped>::MARKUP,
1624    <RoutedEventOf<TransitionCompletedEventArgs> as MarkupTyped>::MARKUP,
1625    <RoutedEventOf<VectorEventArgs> as MarkupTyped>::MARKUP,
1626    <PageSelectionChangedEventArgs as MarkupTyped>::MARKUP,
1627    <RangeBaseValueChangedEventArgs as MarkupTyped>::MARKUP,
1628    <RefreshRequestedEventArgs as MarkupTyped>::MARKUP,
1629    <RequestBringIntoViewEventArgs as MarkupTyped>::MARKUP,
1630    <SelectionChangedEventArgs as MarkupTyped>::MARKUP,
1631    <SizeChangedEventArgs as MarkupTyped>::MARKUP,
1632    <SpinEventArgs as MarkupTyped>::MARKUP,
1633    <TemplateAppliedEventArgs as MarkupTyped>::MARKUP,
1634    <TextChangedEventArgs as MarkupTyped>::MARKUP,
1635    <TextChangingEventArgs as MarkupTyped>::MARKUP,
1636    <TransitionCompletedEventArgs as MarkupTyped>::MARKUP,
1637];