1#![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
46ferro_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
85ferro_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
97ferro_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
136ferro_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
270ferro_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
491ferro_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
825ferro_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
965ferro_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
981ferro_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
1026ferro_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
1152ferro_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
1189ferro_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
1368ferro_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
1389pub(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
1485fn 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
1618pub(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
1636pub(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];