Skip to main content

ferroui_base/markup_types/
contracts.rs

1//! Markup metadata of the contracts of this crate that are types of
2//! members markup can set: each is published under the name of the
3//! interface of the managed original, with the handle types the members of
4//! this port use for it.
5//!
6//! Handles compare by identity.
7
8use crate::data::core::ValueTypes;
9use crate::ferro_markup_type;
10use crate::metadata::{MarkupType, MarkupTyped};
11use std::rc::Rc;
12
13ferro_markup_type!(interface dyn crate::media::IBrush as "IBrush" {
14    namespace: "FerroUI.Media",
15    handles: [Rc<dyn crate::media::IBrush>, Option<Rc<dyn crate::media::IBrush>>],
16    this: Rc<dyn crate::media::IBrush>,
17    parse: crate::media::Brush::parse,
18    properties: [
19        Opacity: f64 { get: |brush: &Rc<dyn crate::media::IBrush>| brush.opacity() },
20        Transform: Option<Rc<dyn crate::media::ITransform>> {
21            get: |brush: &Rc<dyn crate::media::IBrush>| brush.transform()
22        },
23        TransformOrigin: crate::RelativePoint { get: |brush: &Rc<dyn crate::media::IBrush>| brush.transform_origin() },
24    ],
25});
26
27// The brush contracts that are the declared types of static values (`Brushes`):
28// a value of one of them is a brush, through the casts registered below.
29
30impl PartialEq for dyn crate::media::ISolidColorBrush {
31    fn eq(&self, other: &Self) -> bool {
32        crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
33    }
34}
35
36impl PartialEq for dyn crate::media::IImmutableBrush {
37    fn eq(&self, other: &Self) -> bool {
38        crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
39    }
40}
41
42impl PartialEq for dyn crate::media::IImmutableSolidColorBrush {
43    fn eq(&self, other: &Self) -> bool {
44        crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
45    }
46}
47
48ferro_markup_type!(interface dyn crate::media::ISolidColorBrush as "ISolidColorBrush" {
49    namespace: "FerroUI.Media",
50    handles: [Rc<dyn crate::media::ISolidColorBrush>, Option<Rc<dyn crate::media::ISolidColorBrush>>],
51    this: Rc<dyn crate::media::ISolidColorBrush>,
52    interfaces: [Rc<dyn crate::media::IBrush>],
53    properties: [
54        Color: crate::media::Color { get: |brush: &Rc<dyn crate::media::ISolidColorBrush>| brush.color() },
55    ],
56});
57
58ferro_markup_type!(interface dyn crate::media::IImmutableBrush as "IImmutableBrush" {
59    namespace: "FerroUI.Media",
60    handles: [Rc<dyn crate::media::IImmutableBrush>, Option<Rc<dyn crate::media::IImmutableBrush>>],
61    interfaces: [Rc<dyn crate::media::IBrush>],
62});
63
64ferro_markup_type!(interface dyn crate::media::IImmutableSolidColorBrush as "IImmutableSolidColorBrush" {
65    namespace: "FerroUI.Media",
66    handles: [
67        Rc<dyn crate::media::IImmutableSolidColorBrush>,
68        Option<Rc<dyn crate::media::IImmutableSolidColorBrush>>,
69    ],
70    interfaces: [
71        Rc<dyn crate::media::ISolidColorBrush>,
72        Rc<dyn crate::media::IImmutableBrush>,
73        Rc<dyn crate::media::IBrush>,
74    ],
75});
76
77ferro_markup_type!(interface dyn crate::media::IImage as "IImage" {
78    namespace: "FerroUI.Media",
79    handles: [Rc<dyn crate::media::IImage>, Option<Rc<dyn crate::media::IImage>>],
80});
81
82ferro_markup_type!(interface dyn crate::media::IImageBrushSource as "IImageBrushSource" {
83    namespace: "FerroUI.Media",
84    handles: [Rc<dyn crate::media::IImageBrushSource>, Option<Rc<dyn crate::media::IImageBrushSource>>],
85});
86
87// The contract of bitmap-valued properties (`NativeMenuItem.Icon`): text converts to it
88// through the bitmap converter of the XAML runtime library, as it does for `IImage`.
89ferro_markup_type!(interface dyn crate::media::imaging::IBitmap as "IBitmap" {
90    namespace: "FerroUI.Media.Imaging",
91    handles: [Rc<dyn crate::media::imaging::IBitmap>, Option<Rc<dyn crate::media::imaging::IBitmap>>],
92});
93
94// The collection of the fonts of the system (`FontManager.SystemFonts`): a read-only list of
95// font families, which a binding delivers to the items of an items control.
96ferro_markup_type!(interface dyn crate::media::fonts::IFontCollection as "IFontCollection" {
97    namespace: "FerroUI.Media.Fonts",
98    handles: [Rc<dyn crate::media::fonts::IFontCollection>, Option<Rc<dyn crate::media::fonts::IFontCollection>>],
99    this: Rc<dyn crate::media::fonts::IFontCollection>,
100    properties: [
101        Key: crate::utilities::Uri { get: |fonts: &Rc<dyn crate::media::fonts::IFontCollection>| fonts.key() },
102        Count: i32 { get: |fonts: &Rc<dyn crate::media::fonts::IFontCollection>| fonts.count() as i32 },
103    ],
104});
105
106ferro_markup_type!(interface dyn crate::media::ITransform as "ITransform" {
107    namespace: "FerroUI.Media",
108    handles: [Rc<dyn crate::media::ITransform>, Option<Rc<dyn crate::media::ITransform>>],
109    // The transform converter of the managed original: a list of transform operations.
110    parse: |s: &str| {
111        crate::media::transformation::TransformOperations::parse(s)
112            .map(|operations| -> Rc<dyn crate::media::ITransform> { operations })
113    },
114});
115
116ferro_markup_type!(interface dyn crate::media::IPen as "IPen" {
117    namespace: "FerroUI.Media",
118    handles: [Rc<dyn crate::media::IPen>, Option<Rc<dyn crate::media::IPen>>],
119});
120
121ferro_markup_type!(interface dyn crate::media::IDashStyle as "IDashStyle" {
122    namespace: "FerroUI.Media",
123    handles: [Rc<dyn crate::media::IDashStyle>, Option<Rc<dyn crate::media::IDashStyle>>],
124});
125
126ferro_markup_type!(interface dyn crate::media::IExperimentalAcrylicMaterial as "IExperimentalAcrylicMaterial" {
127    namespace: "FerroUI.Media",
128    handles: [Rc<dyn crate::media::IExperimentalAcrylicMaterial>, Option<Rc<dyn crate::media::IExperimentalAcrylicMaterial>>],
129});
130
131ferro_markup_type!(interface dyn crate::media::effects::IEffect as "IEffect" {
132    namespace: "FerroUI.Media",
133    handles: [Rc<dyn crate::media::effects::IEffect>, Option<Rc<dyn crate::media::effects::IEffect>>],
134    parse: crate::media::effects::Effect::parse,
135});
136
137ferro_markup_type!(interface dyn crate::styling::IStyle as "IStyle" {
138    namespace: "FerroUI.Styling",
139    handles: [Rc<dyn crate::styling::IStyle>, Option<Rc<dyn crate::styling::IStyle>>],
140});
141
142ferro_markup_type!(interface dyn crate::styling::IStyleHost as "IStyleHost" {
143    namespace: "FerroUI.Styling",
144    handles: [Rc<dyn crate::styling::IStyleHost>, Option<Rc<dyn crate::styling::IStyleHost>>],
145});
146
147ferro_markup_type!(interface dyn crate::styling::ITemplate as "ITemplate" {
148    namespace: "FerroUI.Styling",
149    handles: [Rc<dyn crate::styling::ITemplate>, Option<Rc<dyn crate::styling::ITemplate>>],
150});
151
152ferro_markup_type!(interface dyn crate::controls::IResourceNode as "IResourceNode" {
153    namespace: "FerroUI.Controls",
154    handles: [Rc<dyn crate::controls::IResourceNode>, Option<Rc<dyn crate::controls::IResourceNode>>],
155});
156
157ferro_markup_type!(interface dyn crate::controls::IResourceHost as "IResourceHost" {
158    namespace: "FerroUI.Controls",
159    handles: [Rc<dyn crate::controls::IResourceHost>, Option<Rc<dyn crate::controls::IResourceHost>>],
160});
161
162ferro_markup_type!(interface dyn crate::controls::IResourceProvider as "IResourceProvider" {
163    namespace: "FerroUI.Controls",
164    handles: [Rc<dyn crate::controls::IResourceProvider>, Option<Rc<dyn crate::controls::IResourceProvider>>],
165});
166
167/// The resource dictionary object behind the contract: the collections of a
168/// dictionary are reached through the class.
169fn resource_dictionary(
170    dictionary: &Rc<dyn crate::controls::IResourceDictionary>,
171) -> Result<crate::Ref<crate::controls::ResourceDictionary>, String> {
172    dictionary
173        .as_object()
174        .and_then(|object| object.to_ref().cast::<crate::controls::ResourceDictionary>())
175        .ok_or_else(|| "The resource dictionary is not a ResourceDictionary.".to_string())
176}
177
178ferro_markup_type!(interface dyn crate::controls::IResourceDictionary as "IResourceDictionary" {
179    namespace: "FerroUI.Controls",
180    handles: [Rc<dyn crate::controls::IResourceDictionary>, Option<Rc<dyn crate::controls::IResourceDictionary>>],
181    this: Rc<dyn crate::controls::IResourceDictionary>,
182    interfaces: [Rc<dyn crate::controls::IResourceProvider>],
183    properties: [
184        Count: i32 { get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| dictionary.count() as i32 },
185        MergedDictionaries: crate::collections::FerroList<Rc<dyn crate::controls::IResourceProvider>> {
186            try_get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| {
187                resource_dictionary(dictionary).map(|dictionary| dictionary.merged_dictionaries())
188            }
189        },
190        ThemeDictionaries: crate::collections::FerroDictionary<
191            crate::styling::ThemeVariant,
192            Rc<dyn crate::controls::IThemeVariantProvider>,
193        > {
194            try_get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| {
195                resource_dictionary(dictionary).map(|dictionary| dictionary.theme_dictionaries())
196            }
197        },
198    ],
199    methods: [
200        // `IDictionary<object, object?>.Add`: adding a key twice is an error.
201        try fn Add(Option<crate::BoxedValue>, Option<crate::BoxedValue>) =>
202            |dictionary: &Rc<dyn crate::controls::IResourceDictionary>,
203             key: Option<crate::BoxedValue>,
204             value: Option<crate::BoxedValue>| {
205                let key = super::plain::resource_key(key)?;
206                if dictionary.contains_key(&key) {
207                    return Err(format!("An item with the same key has already been added. Key: {key}"));
208                }
209                Ok::<(), String>(dictionary.add(key, value))
210            },
211    ],
212});
213
214ferro_markup_type!(interface dyn crate::controls::IThemeVariantProvider as "IThemeVariantProvider" {
215    namespace: "FerroUI.Controls",
216    handles: [Rc<dyn crate::controls::IThemeVariantProvider>, Option<Rc<dyn crate::controls::IThemeVariantProvider>>],
217    this: Rc<dyn crate::controls::IThemeVariantProvider>,
218    interfaces: [Rc<dyn crate::controls::IResourceProvider>],
219    properties: [
220        // The key of the provider in the theme dictionaries it is an entry of.
221        Key: Option<crate::styling::ThemeVariant> {
222            get: |provider: &Rc<dyn crate::controls::IThemeVariantProvider>| provider.key(),
223            set: |provider: &Rc<dyn crate::controls::IThemeVariantProvider>, value: Option<crate::styling::ThemeVariant>| {
224                provider.set_key(value)
225            }
226        },
227    ],
228});
229
230ferro_markup_type!(interface dyn crate::controls::IDeferredContent as "IDeferredContent" {
231    namespace: "FerroUI.Controls",
232    handles: [Rc<dyn crate::controls::IDeferredContent>, Option<Rc<dyn crate::controls::IDeferredContent>>],
233});
234
235ferro_markup_type!(interface dyn crate::input::ICommand as "ICommand" {
236    namespace: "System.Windows.Input",
237    handles: [Rc<dyn crate::input::ICommand>, Option<Rc<dyn crate::input::ICommand>>],
238});
239
240ferro_markup_type!(interface dyn crate::data::converters::IValueConverter as "IValueConverter" {
241    namespace: "FerroUI.Data.Converters",
242    handles: [Rc<dyn crate::data::converters::IValueConverter>, Option<Rc<dyn crate::data::converters::IValueConverter>>],
243});
244
245ferro_markup_type!(interface dyn crate::data::converters::IMultiValueConverter as "IMultiValueConverter" {
246    namespace: "FerroUI.Data.Converters",
247    handles: [Rc<dyn crate::data::converters::IMultiValueConverter>, Option<Rc<dyn crate::data::converters::IMultiValueConverter>>],
248});
249
250ferro_markup_type!(interface dyn crate::animation::easings::IEasing as "IEasing" {
251    namespace: "FerroUI.Animation.Easings",
252    handles: [Rc<dyn crate::animation::easings::IEasing>, Option<Rc<dyn crate::animation::easings::IEasing>>],
253});
254
255ferro_markup_type!(interface dyn crate::animation::ITransition as "ITransition" {
256    namespace: "FerroUI.Animation",
257    handles: [Rc<dyn crate::animation::ITransition>, Option<Rc<dyn crate::animation::ITransition>>],
258});
259
260ferro_markup_type!(interface dyn crate::animation::IAnimation as "IAnimation" {
261    namespace: "FerroUI.Animation",
262    handles: [Rc<dyn crate::animation::IAnimation>, Option<Rc<dyn crate::animation::IAnimation>>],
263});
264
265ferro_markup_type!(interface dyn crate::animation::IAnimationSetter as "IAnimationSetter" {
266    namespace: "FerroUI.Animation",
267    handles: [Rc<dyn crate::animation::IAnimationSetter>, Option<Rc<dyn crate::animation::IAnimationSetter>>],
268});
269
270// The base class of the custom animators of the managed original, the type of the value of
271// the attached property `Animation.Animator`.
272ferro_markup_type!(interface dyn crate::animation::ICustomAnimator as "CustomAnimatorBase" {
273    namespace: "FerroUI.Animation",
274    handles: [Rc<dyn crate::animation::ICustomAnimator>, Option<Rc<dyn crate::animation::ICustomAnimator>>],
275});
276
277ferro_markup_type!(interface dyn crate::animation::IPageTransition as "IPageTransition" {
278    namespace: "FerroUI.Animation",
279    handles: [Rc<dyn crate::animation::IPageTransition>, Option<Rc<dyn crate::animation::IPageTransition>>],
280});
281
282ferro_markup_type!(interface dyn crate::animation::IClock as "IClock" {
283    namespace: "FerroUI.Animation",
284    handles: [Rc<dyn crate::animation::IClock>, Option<Rc<dyn crate::animation::IClock>>],
285});
286
287// The storage provider of a top level (`TopLevel.StorageProvider`), which a binding hands to
288// the storage provider of a picker (`{Binding $parent[TopLevel].StorageProvider}`).
289ferro_markup_type!(interface dyn crate::platform::storage::IStorageProvider as "IStorageProvider" {
290    namespace: "FerroUI.Platform.Storage",
291    handles: [
292        Rc<dyn crate::platform::storage::IStorageProvider>,
293        Option<Rc<dyn crate::platform::storage::IStorageProvider>>
294    ],
295});
296
297ferro_markup_type!(interface dyn crate::metadata::IServiceProvider as "IServiceProvider" {
298    namespace: "System",
299    handles: [Rc<dyn crate::metadata::IServiceProvider>, Option<Rc<dyn crate::metadata::IServiceProvider>>],
300});
301
302ferro_markup_type!(interface dyn crate::INamed as "INamed" {
303    namespace: "FerroUI",
304    handles: [Rc<dyn crate::INamed>, Option<Rc<dyn crate::INamed>>],
305    this: Rc<dyn crate::INamed>,
306    properties: [
307        Name: Option<String> { get: |named: &Rc<dyn crate::INamed>| named.name() },
308    ],
309});
310
311// A name scope is held through `NameScopeRef` (a handle that compares by
312// identity) where it is a property value.
313ferro_markup_type!(interface dyn crate::controls::INameScope as "INameScope" {
314    this: crate::controls::NameScopeRef,
315    namespace: "FerroUI.Controls",
316    handles: [
317        crate::controls::NameScopeRef,
318        Option<crate::controls::NameScopeRef>,
319        Rc<dyn crate::controls::INameScope>,
320        Option<Rc<dyn crate::controls::INameScope>>,
321    ],
322    properties: [
323        IsCompleted: bool { get: |scope: &crate::controls::NameScopeRef| scope.is_completed() },
324    ],
325    methods: [
326        // The original accepts arbitrary non-null objects, including plain models.
327        try fn Register(String, Option<crate::BoxedValue>) =>
328            |scope: &crate::controls::NameScopeRef, name: String, element: Option<crate::BoxedValue>| {
329                match element {
330                    Some(element) => scope.try_register_value(&name, element).map_err(|error| error.to_string()),
331                    None => Err("Value cannot be null. (Parameter 'element')".to_string()),
332                }
333            },
334        fn Find(String) -> Option<crate::BoxedValue> =>
335            |scope: &crate::controls::NameScopeRef, name: String| scope.find_value(&name),
336        fn Complete() => |scope: &crate::controls::NameScopeRef| scope.complete(),
337    ],
338});
339
340// The abstract base classes of the managed original that this port
341// declares as traits.
342
343ferro_markup_type!(class dyn crate::styling::SetterBase as "SetterBase" {
344    namespace: "FerroUI.Styling",
345    handles: [Rc<dyn crate::styling::SetterBase>, Option<Rc<dyn crate::styling::SetterBase>>],
346});
347
348ferro_markup_type!(class dyn crate::data::BindingBase as "BindingBase" {
349    namespace: "FerroUI.Data",
350    handles: [Rc<dyn crate::data::BindingBase>, Option<Rc<dyn crate::data::BindingBase>>],
351});
352
353ferro_markup_type!(class dyn crate::media::TextTrimming as "TextTrimming" {
354    namespace: "FerroUI.Media",
355    handles: [Rc<dyn crate::media::TextTrimming>, Option<Rc<dyn crate::media::TextTrimming>>],
356    parse: <dyn crate::media::TextTrimming>::parse,
357    static_properties: [
358        None: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::none },
359        CharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::character_ellipsis },
360        WordEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::word_ellipsis },
361        PrefixCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::prefix_character_ellipsis },
362        LeadingCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::leading_character_ellipsis },
363        PathSegmentEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::path_segment_ellipsis },
364    ],
365});
366
367/// The types declared in this file.
368pub(super) const TYPES: &[&MarkupType] = &[
369    <dyn crate::INamed as MarkupTyped>::MARKUP,
370    <dyn crate::media::IBrush as MarkupTyped>::MARKUP,
371    <dyn crate::media::ISolidColorBrush as MarkupTyped>::MARKUP,
372    <dyn crate::media::IImmutableBrush as MarkupTyped>::MARKUP,
373    <dyn crate::media::IImmutableSolidColorBrush as MarkupTyped>::MARKUP,
374    <dyn crate::media::IImage as MarkupTyped>::MARKUP,
375    <dyn crate::media::IImageBrushSource as MarkupTyped>::MARKUP,
376    <dyn crate::media::imaging::IBitmap as MarkupTyped>::MARKUP,
377    <dyn crate::media::ITransform as MarkupTyped>::MARKUP,
378    <dyn crate::media::fonts::IFontCollection as MarkupTyped>::MARKUP,
379    <dyn crate::media::IPen as MarkupTyped>::MARKUP,
380    <dyn crate::media::IDashStyle as MarkupTyped>::MARKUP,
381    <dyn crate::media::IExperimentalAcrylicMaterial as MarkupTyped>::MARKUP,
382    <dyn crate::media::effects::IEffect as MarkupTyped>::MARKUP,
383    <dyn crate::styling::IStyle as MarkupTyped>::MARKUP,
384    <dyn crate::styling::IStyleHost as MarkupTyped>::MARKUP,
385    <dyn crate::styling::ITemplate as MarkupTyped>::MARKUP,
386    <dyn crate::controls::IResourceNode as MarkupTyped>::MARKUP,
387    <dyn crate::controls::IResourceHost as MarkupTyped>::MARKUP,
388    <dyn crate::controls::IResourceProvider as MarkupTyped>::MARKUP,
389    <dyn crate::controls::IResourceDictionary as MarkupTyped>::MARKUP,
390    <dyn crate::controls::IThemeVariantProvider as MarkupTyped>::MARKUP,
391    <dyn crate::controls::IDeferredContent as MarkupTyped>::MARKUP,
392    <dyn crate::input::ICommand as MarkupTyped>::MARKUP,
393    <dyn crate::data::converters::IValueConverter as MarkupTyped>::MARKUP,
394    <dyn crate::data::converters::IMultiValueConverter as MarkupTyped>::MARKUP,
395    <dyn crate::animation::easings::IEasing as MarkupTyped>::MARKUP,
396    <dyn crate::animation::ITransition as MarkupTyped>::MARKUP,
397    <dyn crate::animation::IAnimation as MarkupTyped>::MARKUP,
398    <dyn crate::animation::IAnimationSetter as MarkupTyped>::MARKUP,
399    <dyn crate::animation::ICustomAnimator as MarkupTyped>::MARKUP,
400    <dyn crate::animation::IPageTransition as MarkupTyped>::MARKUP,
401    <dyn crate::animation::IClock as MarkupTyped>::MARKUP,
402    <dyn crate::platform::storage::IStorageProvider as MarkupTyped>::MARKUP,
403    <dyn crate::metadata::IServiceProvider as MarkupTyped>::MARKUP,
404    <dyn crate::controls::INameScope as MarkupTyped>::MARKUP,
405    <dyn crate::styling::SetterBase as MarkupTyped>::MARKUP,
406    <dyn crate::data::BindingBase as MarkupTyped>::MARKUP,
407    <dyn crate::media::TextTrimming as MarkupTyped>::MARKUP,
408];
409
410/// Registers the nullable forms of the contract handles that can be held in
411/// untyped values with the untyped value conversions of the current thread.
412/// (The handles of contracts implemented by classes are also registered by
413/// those classes when they are initialised.)
414pub(super) fn register_value_types() {
415    ValueTypes::register_nullable::<Rc<dyn crate::media::IBrush>>();
416    ValueTypes::register_nullable::<Rc<dyn crate::media::ISolidColorBrush>>();
417    ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableBrush>>();
418    ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableSolidColorBrush>>();
419    // A theme variant provider is a resource provider.
420    ValueTypes::register_cast::<Rc<dyn crate::controls::IThemeVariantProvider>, Rc<dyn crate::controls::IResourceProvider>>(
421        |provider| provider.clone(),
422    );
423    // The brush contracts derive from each other.
424    ValueTypes::register_cast::<Rc<dyn crate::media::ISolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
425    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
426    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
427    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::ISolidColorBrush>>(
428        |b| b.clone(),
429    );
430    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IImmutableBrush>>(
431        |b| b.clone(),
432    );
433    ValueTypes::register_nullable::<Rc<dyn crate::media::IImage>>();
434    ValueTypes::register_nullable::<Rc<dyn crate::media::IImageBrushSource>>();
435    ValueTypes::register_nullable::<Rc<dyn crate::media::imaging::IBitmap>>();
436    ValueTypes::register_nullable::<Rc<dyn crate::media::ITransform>>();
437    ValueTypes::register_nullable::<Rc<dyn crate::media::fonts::IFontCollection>>();
438    ValueTypes::register_nullable::<Rc<dyn crate::media::IPen>>();
439    ValueTypes::register_nullable::<Rc<dyn crate::media::IDashStyle>>();
440    ValueTypes::register_nullable::<Rc<dyn crate::media::IExperimentalAcrylicMaterial>>();
441    ValueTypes::register_nullable::<Rc<dyn crate::media::effects::IEffect>>();
442    ValueTypes::register_nullable::<Rc<dyn crate::input::ICommand>>();
443    ValueTypes::register_nullable::<Rc<dyn crate::animation::ITransition>>();
444    ValueTypes::register_nullable::<Rc<dyn crate::animation::IPageTransition>>();
445    ValueTypes::register_nullable::<Rc<dyn crate::animation::IClock>>();
446    ValueTypes::register_nullable::<Rc<dyn crate::platform::storage::IStorageProvider>>();
447    ValueTypes::register_nullable::<Rc<dyn crate::media::TextTrimming>>();
448    ValueTypes::register_nullable::<crate::controls::NameScopeRef>();
449    ValueTypes::register_nullable::<Rc<dyn crate::INamed>>();
450    ValueTypes::register_nullable::<Rc<dyn crate::styling::IStyle>>();
451    ValueTypes::register_nullable::<Rc<dyn crate::styling::SetterBase>>();
452    ValueTypes::register_nullable::<Rc<dyn crate::styling::ITemplate>>();
453    ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceProvider>>();
454    ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceDictionary>>();
455    ValueTypes::register_nullable::<Rc<dyn crate::controls::IThemeVariantProvider>>();
456    ValueTypes::register_nullable::<Rc<dyn crate::controls::IDeferredContent>>();
457    ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IValueConverter>>();
458    ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IMultiValueConverter>>();
459    ValueTypes::register_nullable::<Rc<dyn crate::animation::easings::IEasing>>();
460    ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimation>>();
461    ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimationSetter>>();
462    ValueTypes::register_nullable::<Rc<dyn crate::animation::ICustomAnimator>>();
463    ValueTypes::register_nullable::<Rc<dyn crate::data::BindingBase>>();
464
465}