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