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
287ferro_markup_type!(interface dyn crate::metadata::IServiceProvider as "IServiceProvider" {
288    namespace: "System",
289    handles: [Rc<dyn crate::metadata::IServiceProvider>, Option<Rc<dyn crate::metadata::IServiceProvider>>],
290});
291
292ferro_markup_type!(interface dyn crate::INamed as "INamed" {
293    namespace: "FerroUI",
294    handles: [Rc<dyn crate::INamed>, Option<Rc<dyn crate::INamed>>],
295    this: Rc<dyn crate::INamed>,
296    properties: [
297        Name: Option<String> { get: |named: &Rc<dyn crate::INamed>| named.name() },
298    ],
299});
300
301// A name scope is held through `NameScopeRef` (a handle that compares by
302// identity) where it is a property value.
303ferro_markup_type!(interface dyn crate::controls::INameScope as "INameScope" {
304    this: crate::controls::NameScopeRef,
305    namespace: "FerroUI.Controls",
306    handles: [
307        crate::controls::NameScopeRef,
308        Option<crate::controls::NameScopeRef>,
309        Rc<dyn crate::controls::INameScope>,
310        Option<Rc<dyn crate::controls::INameScope>>,
311    ],
312    properties: [
313        IsCompleted: bool { get: |scope: &crate::controls::NameScopeRef| scope.is_completed() },
314    ],
315    methods: [
316        // The element is any object in the managed original; the port registers objects of the object model.
317        try fn Register(String, Option<crate::BoxedValue>) =>
318            |scope: &crate::controls::NameScopeRef, name: String, element: Option<crate::BoxedValue>| {
319                match element.as_ref().and_then(|element| ValueTypes::as_object(&**element)) {
320                    Some(element) => scope.try_register(&name, element).map_err(|error| error.to_string()),
321                    None => Err("Only an object of the object model can be registered in a name scope.".to_string()),
322                }
323            },
324        fn Find(String) -> Option<crate::Ref<crate::FerroObject>> =>
325            |scope: &crate::controls::NameScopeRef, name: String| scope.find(&name),
326        fn Complete() => |scope: &crate::controls::NameScopeRef| scope.complete(),
327    ],
328});
329
330// The abstract base classes of the managed original that this port
331// declares as traits.
332
333ferro_markup_type!(class dyn crate::styling::SetterBase as "SetterBase" {
334    namespace: "FerroUI.Styling",
335    handles: [Rc<dyn crate::styling::SetterBase>, Option<Rc<dyn crate::styling::SetterBase>>],
336});
337
338ferro_markup_type!(class dyn crate::data::BindingBase as "BindingBase" {
339    namespace: "FerroUI.Data",
340    handles: [Rc<dyn crate::data::BindingBase>, Option<Rc<dyn crate::data::BindingBase>>],
341});
342
343ferro_markup_type!(class dyn crate::media::TextTrimming as "TextTrimming" {
344    namespace: "FerroUI.Media",
345    handles: [Rc<dyn crate::media::TextTrimming>, Option<Rc<dyn crate::media::TextTrimming>>],
346    parse: <dyn crate::media::TextTrimming>::parse,
347    static_properties: [
348        None: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::none },
349        CharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::character_ellipsis },
350        WordEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::word_ellipsis },
351        PrefixCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::prefix_character_ellipsis },
352        LeadingCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::leading_character_ellipsis },
353        PathSegmentEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::path_segment_ellipsis },
354    ],
355});
356
357/// The types declared in this file.
358pub(super) const TYPES: &[&MarkupType] = &[
359    <dyn crate::INamed as MarkupTyped>::MARKUP,
360    <dyn crate::media::IBrush as MarkupTyped>::MARKUP,
361    <dyn crate::media::ISolidColorBrush as MarkupTyped>::MARKUP,
362    <dyn crate::media::IImmutableBrush as MarkupTyped>::MARKUP,
363    <dyn crate::media::IImmutableSolidColorBrush as MarkupTyped>::MARKUP,
364    <dyn crate::media::IImage as MarkupTyped>::MARKUP,
365    <dyn crate::media::IImageBrushSource as MarkupTyped>::MARKUP,
366    <dyn crate::media::imaging::IBitmap as MarkupTyped>::MARKUP,
367    <dyn crate::media::ITransform as MarkupTyped>::MARKUP,
368    <dyn crate::media::fonts::IFontCollection as MarkupTyped>::MARKUP,
369    <dyn crate::media::IPen as MarkupTyped>::MARKUP,
370    <dyn crate::media::IDashStyle as MarkupTyped>::MARKUP,
371    <dyn crate::media::IExperimentalAcrylicMaterial as MarkupTyped>::MARKUP,
372    <dyn crate::media::effects::IEffect as MarkupTyped>::MARKUP,
373    <dyn crate::styling::IStyle as MarkupTyped>::MARKUP,
374    <dyn crate::styling::IStyleHost as MarkupTyped>::MARKUP,
375    <dyn crate::styling::ITemplate as MarkupTyped>::MARKUP,
376    <dyn crate::controls::IResourceNode as MarkupTyped>::MARKUP,
377    <dyn crate::controls::IResourceHost as MarkupTyped>::MARKUP,
378    <dyn crate::controls::IResourceProvider as MarkupTyped>::MARKUP,
379    <dyn crate::controls::IResourceDictionary as MarkupTyped>::MARKUP,
380    <dyn crate::controls::IThemeVariantProvider as MarkupTyped>::MARKUP,
381    <dyn crate::controls::IDeferredContent as MarkupTyped>::MARKUP,
382    <dyn crate::input::ICommand as MarkupTyped>::MARKUP,
383    <dyn crate::data::converters::IValueConverter as MarkupTyped>::MARKUP,
384    <dyn crate::data::converters::IMultiValueConverter as MarkupTyped>::MARKUP,
385    <dyn crate::animation::easings::IEasing as MarkupTyped>::MARKUP,
386    <dyn crate::animation::ITransition as MarkupTyped>::MARKUP,
387    <dyn crate::animation::IAnimation as MarkupTyped>::MARKUP,
388    <dyn crate::animation::IAnimationSetter as MarkupTyped>::MARKUP,
389    <dyn crate::animation::ICustomAnimator as MarkupTyped>::MARKUP,
390    <dyn crate::animation::IPageTransition as MarkupTyped>::MARKUP,
391    <dyn crate::animation::IClock as MarkupTyped>::MARKUP,
392    <dyn crate::metadata::IServiceProvider as MarkupTyped>::MARKUP,
393    <dyn crate::controls::INameScope as MarkupTyped>::MARKUP,
394    <dyn crate::styling::SetterBase as MarkupTyped>::MARKUP,
395    <dyn crate::data::BindingBase as MarkupTyped>::MARKUP,
396    <dyn crate::media::TextTrimming as MarkupTyped>::MARKUP,
397];
398
399/// Registers the nullable forms of the contract handles that can be held in
400/// untyped values with the untyped value conversions of the current thread.
401/// (The handles of contracts implemented by classes are also registered by
402/// those classes when they are initialised.)
403pub(super) fn register_value_types() {
404    ValueTypes::register_nullable::<Rc<dyn crate::media::IBrush>>();
405    ValueTypes::register_nullable::<Rc<dyn crate::media::ISolidColorBrush>>();
406    ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableBrush>>();
407    ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableSolidColorBrush>>();
408    // A theme variant provider is a resource provider.
409    ValueTypes::register_cast::<Rc<dyn crate::controls::IThemeVariantProvider>, Rc<dyn crate::controls::IResourceProvider>>(
410        |provider| provider.clone(),
411    );
412    // The brush contracts derive from each other.
413    ValueTypes::register_cast::<Rc<dyn crate::media::ISolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
414    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
415    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
416    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::ISolidColorBrush>>(
417        |b| b.clone(),
418    );
419    ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IImmutableBrush>>(
420        |b| b.clone(),
421    );
422    ValueTypes::register_nullable::<Rc<dyn crate::media::IImage>>();
423    ValueTypes::register_nullable::<Rc<dyn crate::media::IImageBrushSource>>();
424    ValueTypes::register_nullable::<Rc<dyn crate::media::imaging::IBitmap>>();
425    ValueTypes::register_nullable::<Rc<dyn crate::media::ITransform>>();
426    ValueTypes::register_nullable::<Rc<dyn crate::media::fonts::IFontCollection>>();
427    ValueTypes::register_nullable::<Rc<dyn crate::media::IPen>>();
428    ValueTypes::register_nullable::<Rc<dyn crate::media::IDashStyle>>();
429    ValueTypes::register_nullable::<Rc<dyn crate::media::IExperimentalAcrylicMaterial>>();
430    ValueTypes::register_nullable::<Rc<dyn crate::media::effects::IEffect>>();
431    ValueTypes::register_nullable::<Rc<dyn crate::input::ICommand>>();
432    ValueTypes::register_nullable::<Rc<dyn crate::animation::ITransition>>();
433    ValueTypes::register_nullable::<Rc<dyn crate::animation::IPageTransition>>();
434    ValueTypes::register_nullable::<Rc<dyn crate::animation::IClock>>();
435    ValueTypes::register_nullable::<Rc<dyn crate::media::TextTrimming>>();
436    ValueTypes::register_nullable::<crate::controls::NameScopeRef>();
437    ValueTypes::register_nullable::<Rc<dyn crate::INamed>>();
438    ValueTypes::register_nullable::<Rc<dyn crate::styling::IStyle>>();
439    ValueTypes::register_nullable::<Rc<dyn crate::styling::SetterBase>>();
440    ValueTypes::register_nullable::<Rc<dyn crate::styling::ITemplate>>();
441    ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceProvider>>();
442    ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceDictionary>>();
443    ValueTypes::register_nullable::<Rc<dyn crate::controls::IThemeVariantProvider>>();
444    ValueTypes::register_nullable::<Rc<dyn crate::controls::IDeferredContent>>();
445    ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IValueConverter>>();
446    ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IMultiValueConverter>>();
447    ValueTypes::register_nullable::<Rc<dyn crate::animation::easings::IEasing>>();
448    ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimation>>();
449    ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimationSetter>>();
450    ValueTypes::register_nullable::<Rc<dyn crate::animation::ICustomAnimator>>();
451    ValueTypes::register_nullable::<Rc<dyn crate::data::BindingBase>>();
452
453}