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