<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wikitest.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=REP</id>
		<title>UBIK Wiki Test / Augmensys - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wikitest.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=REP"/>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Special:Contributions/REP"/>
		<updated>2026-04-29T15:55:46Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29587</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29587"/>
				<updated>2026-03-17T09:39:04Z</updated>
		
		<summary type="html">&lt;p&gt;REP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
* Icon set Addition 8: Added Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29586</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29586"/>
				<updated>2026-03-17T09:38:43Z</updated>
		
		<summary type="html">&lt;p&gt;REP: small update to Icon set Addition 8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
Icon set Addition 8: Added Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
* Fixed an issue where the [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#LoadNextLevelCommand|LoadNextLevelCommand]] did not work under specific conditions (invoked in offline and then in online mode).&lt;br /&gt;
* Fixed an issue where [[SYSCLS_CHILDINFOOWNER|child count]] indicators did not update when you delete its child objects which only exist locally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29567</id>
		<title>Version 5.1 (Mobile)</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Version_5.1_(Mobile)&amp;diff=29567"/>
				<updated>2026-03-12T16:57:43Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|Existing pre 5.0 XAMLs are not compatible with UBIK Mobile client 5.1. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK 5 clients can only connect to {{UBIK}} Servers of [[Version 3.6(Server)|version 3.6]] and higher!}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|The minimum supported OS versions are:&lt;br /&gt;
* Android 9;&lt;br /&gt;
* iOS 12.}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Android: Store}}{{key press|iOS: Store}}: Publicly available in Google Play Store / Apple App Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Beta}}: Publicly available in Google Play Store as beta versions. You can opt in or out of the beta at any time in the store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Android: Store Preview}}: Available through Google Play Store's [https://play.google.com/store/apps/details?id=com.augmensys.ubik.go invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Beta}}: Available through Apple App Store's [https://testflight.apple.com/join/Kmb1HG9E invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|iOS: Store Preview}}: Available through Apple App Store's [https://testflight.apple.com/join/yHRnbYbt invitation link].&lt;br /&gt;
&lt;br /&gt;
{{key press|Windows: Store Preview}}: The mobile Windows client is not an official product and is only distributed as test versions upon request and/or in our [https://release.augmensys.com/download/modules/client/mobile/ release portal].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with a ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== 5.1.?? 2026-??-?? {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Introduced a new [[MRO_Objects_(Client)#Picture_Task|picture task]] type which can only be finished when there's at least one valid child document.&lt;br /&gt;
* The system flashlight can now also be enabled or disabled via XAML customization. For detailed information, see [[Mobile XAML#Flashlight|Flashlight]]&lt;br /&gt;
* Replaced app closing after repeated failed login attempts with a client-side temporary login block, including user feedback that indicates when login becomes available again.&lt;br /&gt;
* Added French localization to the app.&lt;br /&gt;
* [[MRO_Objects_(Client)#Signature_Task|MRO Signature Tasks]] have been introduced, which automatically displays the signee as well as the validation timestamp after the task has been signed.&lt;br /&gt;
* Fixed an issue where changes in property editing were not discarded when using the default Back button.&lt;br /&gt;
* Fixed an issue where the application crashed on Windows when navigating back from the VideoPlayer.&lt;br /&gt;
* Icon set Addition 8 adds Show/Hide, AI, Info, and various Procedure icons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.30 2026-03-02 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue that prevented any documents from being uploaded when connecting to 5.1 webservices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.29 on 2026-02-26 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* Fixed an issue where the POI button was only visible under certain condition (ShowUnreleasedFeatures in the profile is set to true).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.1.28 on 2026-02-10 {{key press|Android: Store}}{{key press|iOS: Store}} ===&lt;br /&gt;
* The following features which existed in pre 5.0 versions are now available again in 5.1.&lt;br /&gt;
** [[Map_View|Map view]].&lt;br /&gt;
** [[POI_View_(Mobile)|POI view]]. (Aruco and OCR are not yet supported)&lt;br /&gt;
** Location service.&lt;br /&gt;
** [[Native_Push_(Client)|Native push]].&lt;br /&gt;
** [[Charts]].&lt;br /&gt;
* UBIK now uses industry-standard JSON Web Token (JWT) technology for authorization, enhancing security and reliability. Session tokens are transmitted via HTTP headers instead of URLs for improved protection.&lt;br /&gt;
* Added support for conditionally showing the ImageEditor Save button only when edits have been made, enabled when MergeAnnotationsOnSave is set to true.&lt;br /&gt;
* Complete UI overhaul introduces a cleaner, more modern and adaptive user interface with various quality of life improvements.&lt;br /&gt;
* UBIKTabView supports both dynamic and static items in combination with lazy loading.&lt;br /&gt;
* Files in the app's data folder can now be opened or deleted directly in the developer settings.&lt;br /&gt;
* Introduced a fully resource-driven UI theming system enabling fast, safe customization (dark mode, resizing, and consistent styling) by adapting a small set of centralized resources.&lt;br /&gt;
* Added support for [[File_Upload_Size_Restriction|configurable file-upload size restrictions]], preventing oversized files from being uploaded and providing users with feedback when limits are exceeded.&lt;br /&gt;
* Fixed an issue where annotated image documents do not appear as changed until the UI refreshes.&lt;br /&gt;
* Fixed an issue where displayed file content does not update after you revert its changes.&lt;br /&gt;
* Fixed an issue where remembered scroll positions were lost when the ItemsSource property of an SfListViewExt changed (e.g., Properties.ShowAllProperties).&lt;br /&gt;
* The UI now updates correctly after mass deletion in multi-selection mode.&lt;br /&gt;
* Fixed issue that caused app to be stuck on splash screen after resuming from background.&lt;br /&gt;
* Fixed an issue where StatusColor was not shown in the UI for objects that didn't additionally have a Progress.&lt;br /&gt;
* Fixed an issue where the Chart Thresholds didn't update.&lt;br /&gt;
* Fixed an issue that caused content of the custom ContentControl to not be rendered sometimes.&lt;br /&gt;
* (Android) Fixed an issue in the WebView where some links could not be opened.&lt;br /&gt;
* Fixed an issue where toggling NA in the String Editor did not behave correctly.&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
* Fixed an issue where document creation might not be properly enabled in certain customizing scenarios. For example, a media creation button might be disabled until a page refresh.&lt;br /&gt;
* Fixed an issue where batch creating documents (by multi selecting files to attach) can be interrupted if you leave the page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* Due to third-party limitations, the feature that shows the ImageEditor Save button only when edits have been made is only active when MergeAnnotationsOnSave is set to true. In Mobile, deleting the last annotation does not correctly update the editor's internal edit state. As a result, the Save button may remain visible even though no edits exist.&lt;br /&gt;
* When changing the device orientation during attaching a photo on iOS, the app gets stuck. This is an issue Microsoft confirmed in .NET9 and will fix in .NET10.&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Currently, the Samsung keyboard doesn't show {{key press|,}} at all, regardless of the current language/locale setting of the device. Please use a different virtual keyboard (e.g. Gboard from Google) instead if {{key press|.}} is unacceptable.&lt;br /&gt;
* The periodic execution of background pushes is not guaranteed on iOS (the native push feature doesn't have this issue).&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* It is currently not possible to select which camera to use for AR views (e.g. scan page) on Windows.&lt;br /&gt;
* SfPullToRefresh was removed due to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_Mobile_client|existing issues]], and replaced with a Refresh option in the Context menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
Due to the change of the underlying XAML technology, the existing XAMLs for the old mobile clients (pre 5.0) are no longer compatible. Please refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] for migrating them to the new client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Mobile|Version 5.1 (Mobile)]]&lt;br /&gt;
[[Category:Version 5.1|Version 5.1 (Mobile)]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29563</id>
		<title>Icon Font</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29563"/>
				<updated>2026-03-12T10:40:47Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Viewing Icons */ clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''UBIK-Standard.ttf''' is a custom set of font icons developed primarily for use on the Mobile Client, due to concerns over the legality of using Microsoft's Segoe MDL2 Assets icon font file on non-Windows platforms (ie. Android and iOS). Apart from this legal concern, having a standardized font icon set will contribute to having a more consistent look across the various platforms and clients as UBIK-Standard.ttf becomes more widely adopted.&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is an &amp;lt;I&amp;gt;Icon Font&amp;lt;/I&amp;gt;. For Mobile, the standard Text Font is [https://rsms.me/inter/ Inter], which is included in the resources and thus available to use immediately.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is currently only supported for the Mobile client.}}&lt;br /&gt;
&lt;br /&gt;
==Viewing Icons==&lt;br /&gt;
{{Hint|The latest font set can be downloaded directly from here using the [[File:UBIK-Standard.zip]] file.}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to view which icons are available in the set.&lt;br /&gt;
The first requires installing [https://apps.microsoft.com/detail/9WZDNCRDXF41?hl=en-us&amp;amp;gl=AT&amp;amp;ocid=pdpshare Character Map] from the Microsoft store.&lt;br /&gt;
Then, download the UBIK-Standard.zip linked above and locate the UBIK-Standard.tff (inside the 'fonts' subfolder). Once the .ttf is also installed on your local PC, you can use the Character Map program you just installed to get a good overview of the full icon set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hexlabelsinmap.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For finding the human readable labels that can be used in your xamlx files to display specific icons, you must make sure to unzip UBIK-Standard.zip, then you can open the 'demo.html' file in your web browser. Search for the icon you want either by its Hex code or character value (which you can find in Character Map under the 'Glyph Code' section, or by pressing the Copy button, respectively). These are displayed in the demo.html file on the right and left under each icon, respecitvely. For searching by Hex code, only the last 2-3 characters are required, such as &amp;quot;26&amp;quot; or &amp;quot;123&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Textlabelsinweb.PNG]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile|Icon Font]]&lt;br /&gt;
[[Category:Pages with broken file links|Icon Font]]&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
Using XAML, Glyphs can be called in two ways. One method is to use the Hex Code, and another is the In-App Name. Of these two methods, the recommended method is to use the In-App Name, as it uses a natural language attribute as opposed to a glyph code, making it more immediately apparent which icon is being requested by the code.&lt;br /&gt;
&lt;br /&gt;
The two below examples show how one might use both methods to create a User symbol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====In-App Name Usage====&lt;br /&gt;
In the below example, &amp;lt;code&amp;gt;Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&amp;lt;/code&amp;gt; is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; symbol.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel&lt;br /&gt;
    Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&lt;br /&gt;
                            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
                            PrimaryColor=&amp;quot;{DynamicResource UBIKLightTextColor}&amp;quot;&lt;br /&gt;
                            Style=&amp;quot;{DynamicResource HeaderSymbolStyle}&amp;quot;&lt;br /&gt;
                            VerticalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Hex Code Usage====&lt;br /&gt;
In the below example, the attribute &amp;lt;code&amp;gt;Glyph=&amp;lt;/code&amp;gt; and the following Hex Code is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; icon. These Hex codes can be found using a Character Map program, or by searching through the icon tables below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel Glyph=&amp;quot;&amp;amp;#x22;&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot;  /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Directly Accessing Icons====&lt;br /&gt;
The icons can also be used like every other font by setting the &amp;lt;code&amp;gt;FontFamily&amp;lt;/code&amp;gt; attribute. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:resources=&amp;quot;clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Label HorizontalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        HorizontalTextAlignment=&amp;quot;Center&amp;quot; &lt;br /&gt;
        Text=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot; &lt;br /&gt;
        FontFamily=&amp;quot;{x:Static UBIKSymbols}&amp;quot; &lt;br /&gt;
        VerticalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        VerticalTextAlignment=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Available Icons==&lt;br /&gt;
There are two options available to a customizer wishing to browse available icons.&lt;br /&gt;
{{Hint|If a required icon is not found in UBIK, it is instead possible to [[Xamarin_XAML#Custom_Icons|render custom icons using Path data]].}}&lt;br /&gt;
&lt;br /&gt;
'''The best way''' is to download and unzip  the [[File:UBIK-Standard.zip]] file. Once unzipped, open the &amp;quot;demo&amp;quot; webpage file to view all icons, as well as the [[Icon_Font#In-App_Name_Usage|human readable labels]] you can use to render them in your UI. Because the demo webpage does not provide a good overview of all the icons, it is possible to combine this approach with the second one described below using that to browse the icons, and then this method to retrieve the human readable labels for the icons you wish to use.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The second way requires installation of the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse the characters of all the fonts installed on your machine, so to use this method you should certainly download and install the latest version of UBIK-Standard.ttf above. The downside of using this method is that you don't have access to the human readable labels using this app. &lt;br /&gt;
{{Attention|Note that icons installed on your machine are not necessarily available to customers, as they only have access to the icons delivered through UBIK, which is version-dependent.}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
The development of the custom icon font on the Mobile client was hampered significantly by unexpected icon substitutions, which appeared to be vendor/device-specific. To avoid this issue, the individual icons in the text file were mapped to the Hex codes used by the most basic alphabet and symbol characters.&lt;br /&gt;
&lt;br /&gt;
A second issue was encountered where using unstable behavior was observed when using UBIK-Standard.ttf for icons when the user switched tabs, leaving UBIK running in the background. In these cases, circular icon containers became square when switching back to the app, and the icon glyphs were no longer visible. However, using the &amp;lt;i&amp;gt;GlyphButton&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;GlyphLabel&amp;lt;/i&amp;gt; elements (as opposed to simply &amp;lt;i&amp;gt;Button&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;Label&amp;lt;/i&amp;gt;) seems to prevent this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creation==&lt;br /&gt;
The process for creating icons is documented here.&lt;br /&gt;
&lt;br /&gt;
===Step 01: Asset Creation===&lt;br /&gt;
The first step is to find similar, open-source icons to tweak. [https://themes-pixeden.com/font-demos/7-stroke/ Pixeden], [https://lineicons.com/icons/ LineIcons], or [https://linea.io/ LineA], are good starting points, as they have a similar style.&lt;br /&gt;
&lt;br /&gt;
When tweaking (for example, in Adobe Illustrator), use a stroke width of 3 for the base line thickness.&lt;br /&gt;
&lt;br /&gt;
It is good practice to produce three sets of .SVGs; a stroke version, an expanded version, and a final version. The stroke version is more easily edited, but the lines must be 'expanded' in Illustrator to be imported as icons. Finally, duplicate the expanded version, and name it using the following syntax: &lt;br /&gt;
&amp;lt;code&amp;gt;001#ubik-U0x26&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The first number is used to keep the icon list orderly.&lt;br /&gt;
* Add as many tags as desired using the # as separators. For example, a check mark icon may be listed as #ok#confirm#check. The - ends the tag portion of the syntax.&lt;br /&gt;
* The glyph code assigns the icon to a certain space on the character map. As different device vendors block different glyph code sets for different uses, it is good practice to overwrite the basic alphabet, numbers, and symbols, to ensure the icons work on a large range of devices. Starting from 21, glyph codes may use numbers, or letters from 2A (2 here being an example) to 2F.&lt;br /&gt;
&lt;br /&gt;
===Step 02: TTF Generation===&lt;br /&gt;
[https://icomoon.io/app/ IcoMoon] is a useful online tool for generating the icon font, that can then be installed on a device or packaged into the client resources.&lt;br /&gt;
&lt;br /&gt;
* Import Icons (top left) - Use this button to import an already existing font file, when creating additions, for example.&lt;br /&gt;
* On the Selection tab (bottom center), ensure that the desired set is fully selected, and shown with an orange outline. &lt;br /&gt;
* On the Generate Font tab (bottom right), double check the generated tags for the icons. The settings button beside the download button allows you to edit the font file name and version. &lt;br /&gt;
* The download button exports the .ttf, among other resources, in a .ZIP, that is then downloaded.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile|Icon Font]]&lt;br /&gt;
[[Category:Pages with broken file links|Icon Font]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29562</id>
		<title>Icon Font</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29562"/>
				<updated>2026-03-12T10:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;REP: Added info on how to view icon set&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''UBIK-Standard.ttf''' is a custom set of font icons developed primarily for use on the Mobile Client, due to concerns over the legality of using Microsoft's Segoe MDL2 Assets icon font file on non-Windows platforms (ie. Android and iOS). Apart from this legal concern, having a standardized font icon set will contribute to having a more consistent look across the various platforms and clients as UBIK-Standard.ttf becomes more widely adopted.&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is an &amp;lt;I&amp;gt;Icon Font&amp;lt;/I&amp;gt;. For Mobile, the standard Text Font is [https://rsms.me/inter/ Inter], which is included in the resources and thus available to use immediately.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is currently only supported for the Mobile client.}}&lt;br /&gt;
&lt;br /&gt;
==Viewing Icons==&lt;br /&gt;
{{Hint|The latest font set can be downloaded directly from here using the [[File:UBIK-Standard.zip]] file.}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to view which icons are available in the set.&lt;br /&gt;
The first requires installing [https://apps.microsoft.com/detail/9WZDNCRDXF41?hl=en-us&amp;amp;gl=AT&amp;amp;ocid=pdpshare Character Map] from the Microsoft store.&lt;br /&gt;
Then, download the UBIK-Standard.zip linked above and locate the UBIK-Standard.tff (inside the 'fonts' subfolder). Once this is installed on your local PC, you can use the Character Map program you just installed to get a good overview of the full icon set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hexlabelsinmap.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For finding the human readable labels that can be used in your xamlx files to display specific icons, you must make sure to unzip UBIK-Standard.zip, then you can open the 'demo.html' file in your web browser. Search for the icon you want either by its Hex code or character value (which you can find in Character Map under the 'Glyph Code' section, or by pressing the Copy button, respectively). These are displayed in the demo.html file on the right and left under each icon, respecitvely. For searching by Hex code, only the last 2-3 characters are required, such as &amp;quot;26&amp;quot; or &amp;quot;123&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[File:Textlabelsinweb.PNG]]&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
Using XAML, Glyphs can be called in two ways. One method is to use the Hex Code, and another is the In-App Name. Of these two methods, the recommended method is to use the In-App Name, as it uses a natural language attribute as opposed to a glyph code, making it more immediately apparent which icon is being requested by the code.&lt;br /&gt;
&lt;br /&gt;
The two below examples show how one might use both methods to create a User symbol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====In-App Name Usage====&lt;br /&gt;
In the below example, &amp;lt;code&amp;gt;Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&amp;lt;/code&amp;gt; is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; symbol.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel&lt;br /&gt;
    Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&lt;br /&gt;
                            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
                            PrimaryColor=&amp;quot;{DynamicResource UBIKLightTextColor}&amp;quot;&lt;br /&gt;
                            Style=&amp;quot;{DynamicResource HeaderSymbolStyle}&amp;quot;&lt;br /&gt;
                            VerticalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Hex Code Usage====&lt;br /&gt;
In the below example, the attribute &amp;lt;code&amp;gt;Glyph=&amp;lt;/code&amp;gt; and the following Hex Code is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; icon. These Hex codes can be found using a Character Map program, or by searching through the icon tables below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel Glyph=&amp;quot;&amp;amp;#x22;&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot;  /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Directly Accessing Icons====&lt;br /&gt;
The icons can also be used like every other font by setting the &amp;lt;code&amp;gt;FontFamily&amp;lt;/code&amp;gt; attribute. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:resources=&amp;quot;clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Label HorizontalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        HorizontalTextAlignment=&amp;quot;Center&amp;quot; &lt;br /&gt;
        Text=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot; &lt;br /&gt;
        FontFamily=&amp;quot;{x:Static UBIKSymbols}&amp;quot; &lt;br /&gt;
        VerticalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        VerticalTextAlignment=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Available Icons==&lt;br /&gt;
There are two options available to a customizer wishing to browse available icons.&lt;br /&gt;
{{Hint|If a required icon is not found in UBIK, it is instead possible to [[Xamarin_XAML#Custom_Icons|render custom icons using Path data]].}}&lt;br /&gt;
&lt;br /&gt;
'''The best way''' is to download and unzip  the [[File:UBIK-Standard.zip]] file. Once unzipped, open the &amp;quot;demo&amp;quot; webpage file to view all icons, as well as the [[Icon_Font#In-App_Name_Usage|human readable labels]] you can use to render them in your UI. Because the demo webpage does not provide a good overview of all the icons, it is possible to combine this approach with the second one described below using that to browse the icons, and then this method to retrieve the human readable labels for the icons you wish to use.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The second way requires installation of the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse the characters of all the fonts installed on your machine, so to use this method you should certainly download and install the latest version of UBIK-Standard.ttf above. The downside of using this method is that you don't have access to the human readable labels using this app. &lt;br /&gt;
{{Attention|Note that icons installed on your machine are not necessarily available to customers, as they only have access to the icons delivered through UBIK, which is version-dependent.}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
The development of the custom icon font on the Mobile client was hampered significantly by unexpected icon substitutions, which appeared to be vendor/device-specific. To avoid this issue, the individual icons in the text file were mapped to the Hex codes used by the most basic alphabet and symbol characters.&lt;br /&gt;
&lt;br /&gt;
A second issue was encountered where using unstable behavior was observed when using UBIK-Standard.ttf for icons when the user switched tabs, leaving UBIK running in the background. In these cases, circular icon containers became square when switching back to the app, and the icon glyphs were no longer visible. However, using the &amp;lt;i&amp;gt;GlyphButton&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;GlyphLabel&amp;lt;/i&amp;gt; elements (as opposed to simply &amp;lt;i&amp;gt;Button&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;Label&amp;lt;/i&amp;gt;) seems to prevent this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creation==&lt;br /&gt;
The process for creating icons is documented here.&lt;br /&gt;
&lt;br /&gt;
===Step 01: Asset Creation===&lt;br /&gt;
The first step is to find similar, open-source icons to tweak. [https://themes-pixeden.com/font-demos/7-stroke/ Pixeden], [https://lineicons.com/icons/ LineIcons], or [https://linea.io/ LineA], are good starting points, as they have a similar style.&lt;br /&gt;
&lt;br /&gt;
When tweaking (for example, in Adobe Illustrator), use a stroke width of 3 for the base line thickness.&lt;br /&gt;
&lt;br /&gt;
It is good practice to produce three sets of .SVGs; a stroke version, an expanded version, and a final version. The stroke version is more easily edited, but the lines must be 'expanded' in Illustrator to be imported as icons. Finally, duplicate the expanded version, and name it using the following syntax: &lt;br /&gt;
&amp;lt;code&amp;gt;001#ubik-U0x26&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The first number is used to keep the icon list orderly.&lt;br /&gt;
* Add as many tags as desired using the # as separators. For example, a check mark icon may be listed as #ok#confirm#check. The - ends the tag portion of the syntax.&lt;br /&gt;
* The glyph code assigns the icon to a certain space on the character map. As different device vendors block different glyph code sets for different uses, it is good practice to overwrite the basic alphabet, numbers, and symbols, to ensure the icons work on a large range of devices. Starting from 21, glyph codes may use numbers, or letters from 2A (2 here being an example) to 2F.&lt;br /&gt;
&lt;br /&gt;
===Step 02: TTF Generation===&lt;br /&gt;
[https://icomoon.io/app/ IcoMoon] is a useful online tool for generating the icon font, that can then be installed on a device or packaged into the client resources.&lt;br /&gt;
&lt;br /&gt;
* Import Icons (top left) - Use this button to import an already existing font file, when creating additions, for example.&lt;br /&gt;
* On the Selection tab (bottom center), ensure that the desired set is fully selected, and shown with an orange outline. &lt;br /&gt;
* On the Generate Font tab (bottom right), double check the generated tags for the icons. The settings button beside the download button allows you to edit the font file name and version. &lt;br /&gt;
* The download button exports the .ttf, among other resources, in a .ZIP, that is then downloaded.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile|Icon Font]]&lt;br /&gt;
[[Category:Pages with broken file links|Icon Font]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29561</id>
		<title>File:Hexlabelsinmap.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29561"/>
				<updated>2026-03-12T10:38:34Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:Hexlabelsinmap.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29560</id>
		<title>File:Hexlabelsinmap.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29560"/>
				<updated>2026-03-12T10:35:39Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:Hexlabelsinmap.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29559</id>
		<title>File:Hexlabelsinmap.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29559"/>
				<updated>2026-03-12T10:35:37Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:Hexlabelsinmap.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29558</id>
		<title>File:Textlabelsinweb.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29558"/>
				<updated>2026-03-12T10:34:36Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:Textlabelsinweb.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29557</id>
		<title>File:Textlabelsinweb.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29557"/>
				<updated>2026-03-12T10:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:Textlabelsinweb.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29556</id>
		<title>File:Hexlabelsinmap.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Hexlabelsinmap.PNG&amp;diff=29556"/>
				<updated>2026-03-12T10:32:53Z</updated>
		
		<summary type="html">&lt;p&gt;REP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29555</id>
		<title>File:Textlabelsinweb.PNG</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:Textlabelsinweb.PNG&amp;diff=29555"/>
				<updated>2026-03-12T10:32:25Z</updated>
		
		<summary type="html">&lt;p&gt;REP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29553</id>
		<title>Icon Font</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Icon_Font&amp;diff=29553"/>
				<updated>2026-03-12T09:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Mobile Client */ removed mention of icon tables as they were eliminated due to maintenance cost&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''UBIK-Standard.ttf''' is a custom set of font icons developed primarily for use on the Mobile Client, due to concerns over the legality of using Microsoft's Segoe MDL2 Assets icon font file on non-Windows platforms (ie. Android and iOS). Apart from this legal concern, having a standardized font icon set will contribute to having a more consistent look across the various platforms and clients as UBIK-Standard.ttf becomes more widely adopted.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The latest font set can be downloaded directly from here using the [[File:UBIK-Standard.zip]] file.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is an &amp;lt;I&amp;gt;Icon Font&amp;lt;/I&amp;gt;. For Mobile, the standard Text Font is [https://rsms.me/inter/ Inter], which is included in the resources and thus available to use immediately.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|UBIK-Standard is currently only supported for the Mobile client.}}&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
Using XAML, Glyphs can be called in two ways. One method is to use the Hex Code, and another is the In-App Name. Of these two methods, the recommended method is to use the In-App Name, as it uses a natural language attribute as opposed to a glyph code, making it more immediately apparent which icon is being requested by the code.&lt;br /&gt;
&lt;br /&gt;
The two below examples show how one might use both methods to create a User symbol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====In-App Name Usage====&lt;br /&gt;
In the below example, &amp;lt;code&amp;gt;Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&amp;lt;/code&amp;gt; is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; symbol.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel&lt;br /&gt;
    Glyph=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot;&lt;br /&gt;
                            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
                            PrimaryColor=&amp;quot;{DynamicResource UBIKLightTextColor}&amp;quot;&lt;br /&gt;
                            Style=&amp;quot;{DynamicResource HeaderSymbolStyle}&amp;quot;&lt;br /&gt;
                            VerticalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Hex Code Usage====&lt;br /&gt;
In the below example, the attribute &amp;lt;code&amp;gt;Glyph=&amp;lt;/code&amp;gt; and the following Hex Code is used to call the &amp;lt;I&amp;gt;User&amp;lt;/I&amp;gt; icon. These Hex codes can be found using a Character Map program, or by searching through the icon tables below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:GlyphLabel Glyph=&amp;quot;&amp;amp;#x22;&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot;  /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Directly Accessing Icons====&lt;br /&gt;
The icons can also be used like every other font by setting the &amp;lt;code&amp;gt;FontFamily&amp;lt;/code&amp;gt; attribute. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:resources=&amp;quot;clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Label HorizontalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        HorizontalTextAlignment=&amp;quot;Center&amp;quot; &lt;br /&gt;
        Text=&amp;quot;{x:Static resources:UBIKIcons.User}&amp;quot; &lt;br /&gt;
        FontFamily=&amp;quot;{x:Static UBIKSymbols}&amp;quot; &lt;br /&gt;
        VerticalOptions=&amp;quot;Center&amp;quot; &lt;br /&gt;
        VerticalTextAlignment=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile|Icon Font]]&lt;br /&gt;
[[Category:Pages with broken file links|Icon Font]]&lt;br /&gt;
&lt;br /&gt;
== Available Icons==&lt;br /&gt;
There are two options available to a customizer wishing to browse available icons.&lt;br /&gt;
{{Hint|If a required icon is not found in UBIK, it is instead possible to [[Xamarin_XAML#Custom_Icons|render custom icons using Path data]].}}&lt;br /&gt;
&lt;br /&gt;
'''The best way''' is to download and unzip  the [[File:UBIK-Standard.zip]] file. Once unzipped, open the &amp;quot;demo&amp;quot; webpage file to view all icons, as well as the [[Icon_Font#In-App_Name_Usage|human readable labels]] you can use to render them in your UI. Because the demo webpage does not provide a good overview of all the icons, it is possible to combine this approach with the second one described below using that to browse the icons, and then this method to retrieve the human readable labels for the icons you wish to use.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The second way requires installation of the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse the characters of all the fonts installed on your machine, so to use this method you should certainly download and install the latest version of UBIK-Standard.ttf above. The downside of using this method is that you don't have access to the human readable labels using this app. &lt;br /&gt;
{{Attention|Note that icons installed on your machine are not necessarily available to customers, as they only have access to the icons delivered through UBIK, which is version-dependent.}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
===Mobile Client===&lt;br /&gt;
The development of the custom icon font on the Mobile client was hampered significantly by unexpected icon substitutions, which appeared to be vendor/device-specific. To avoid this issue, the individual icons in the text file were mapped to the Hex codes used by the most basic alphabet and symbol characters.&lt;br /&gt;
&lt;br /&gt;
A second issue was encountered where using unstable behavior was observed when using UBIK-Standard.ttf for icons when the user switched tabs, leaving UBIK running in the background. In these cases, circular icon containers became square when switching back to the app, and the icon glyphs were no longer visible. However, using the &amp;lt;i&amp;gt;GlyphButton&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;GlyphLabel&amp;lt;/i&amp;gt; elements (as opposed to simply &amp;lt;i&amp;gt;Button&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;Label&amp;lt;/i&amp;gt;) seems to prevent this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creation==&lt;br /&gt;
The process for creating icons is documented here.&lt;br /&gt;
&lt;br /&gt;
===Step 01: Asset Creation===&lt;br /&gt;
The first step is to find similar, open-source icons to tweak. [https://themes-pixeden.com/font-demos/7-stroke/ Pixeden], [https://lineicons.com/icons/ LineIcons], or [https://linea.io/ LineA], are good starting points, as they have a similar style.&lt;br /&gt;
&lt;br /&gt;
When tweaking (for example, in Adobe Illustrator), use a stroke width of 3 for the base line thickness.&lt;br /&gt;
&lt;br /&gt;
It is good practice to produce three sets of .SVGs; a stroke version, an expanded version, and a final version. The stroke version is more easily edited, but the lines must be 'expanded' in Illustrator to be imported as icons. Finally, duplicate the expanded version, and name it using the following syntax: &lt;br /&gt;
&amp;lt;code&amp;gt;001#ubik-U0x26&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The first number is used to keep the icon list orderly.&lt;br /&gt;
* Add as many tags as desired using the # as separators. For example, a check mark icon may be listed as #ok#confirm#check. The - ends the tag portion of the syntax.&lt;br /&gt;
* The glyph code assigns the icon to a certain space on the character map. As different device vendors block different glyph code sets for different uses, it is good practice to overwrite the basic alphabet, numbers, and symbols, to ensure the icons work on a large range of devices. Starting from 21, glyph codes may use numbers, or letters from 2A (2 here being an example) to 2F.&lt;br /&gt;
&lt;br /&gt;
===Step 02: TTF Generation===&lt;br /&gt;
[https://icomoon.io/app/ IcoMoon] is a useful online tool for generating the icon font, that can then be installed on a device or packaged into the client resources.&lt;br /&gt;
&lt;br /&gt;
* Import Icons (top left) - Use this button to import an already existing font file, when creating additions, for example.&lt;br /&gt;
* On the Selection tab (bottom center), ensure that the desired set is fully selected, and shown with an orange outline. &lt;br /&gt;
* On the Generate Font tab (bottom right), double check the generated tags for the icons. The settings button beside the download button allows you to edit the font file name and version. &lt;br /&gt;
* The download button exports the .ttf, among other resources, in a .ZIP, that is then downloaded.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile|Icon Font]]&lt;br /&gt;
[[Category:Pages with broken file links|Icon Font]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29549</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29549"/>
				<updated>2026-03-11T15:33:33Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Highly Recommended */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29548</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29548"/>
				<updated>2026-03-11T15:33:05Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Highly Recommended */ Added sections on Delay/LazyLoad and TemplateConverter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== Performance improvements for UBIKContentView or ContentControl ===&lt;br /&gt;
UBIKContentView has been updated with performance improving measures, namely the possibility for [[Mobile_XAML#Delay_and_LazyLoading|LazyLoading or Delaying content rendering]]. &lt;br /&gt;
{{Attention|These performance improvements only work when used with the TemplateConverter syntax documented in the next section!}}&lt;br /&gt;
&lt;br /&gt;
* A default delay of 50 milliseconds was added to all content rendered via UBIKContentView or ContentControl which was conversely found to increase client reactivity. This can be adjusted using the Delay attribute on any such control.&lt;br /&gt;
* It is recommended to add LazyLoading=&amp;quot;True&amp;quot; UBIKContentView or ContentControl that are not immediately displayed in the UI (a similar concept to our [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Recommended_Usage|LoadNextLevel]] recommendation). &lt;br /&gt;
** When used in the content of a UBIKTabView tab, the LazyLoading is handled automatically when the tab is activated (see: UBIKContentArea).&lt;br /&gt;
** LazyLoading can be manually triggered on any contentview outside of UBIKTabView by triggering the TriggerLazyLoad() method.&lt;br /&gt;
&lt;br /&gt;
=== TemplateConverter for UBIKContentView or ContentControl ===&lt;br /&gt;
The recommended syntax for embedding templates within other templates has changed due to performance improvements from Delay or LazyLoading the rendering of content. Note that this refers only to directly mentioned templates, rather than when using TemplateSelectors. A good example can be seen in the tab contents of UBIKContentArea for Properties and Documents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView  &lt;br /&gt;
    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ✅&lt;br /&gt;
    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the above example uses the new TemplateConverter together with the name of the desired template, in this case UBIKPropertyArea. &lt;br /&gt;
&lt;br /&gt;
The former syntax would have been: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;❌ Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
This 'hardcoded' syntax bypasses the template selection mechanism which includes the various performance improvements mentioned above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29511</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29511"/>
				<updated>2026-03-10T15:49:24Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* SfPullToRefresh */ Tried to make message not to use PTR clearer as AI didnt get it&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to issues in the SfPullToRefresh control it was removed from all standard UBIK UIs and should not be used in customizings. For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button, simply to strip the PTR wrapper is enough.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29510</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29510"/>
				<updated>2026-03-10T15:46:56Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* SfTabView */ added warning and link to UBIKTabView&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
{{Attention|In UBIK Maui, [[HowTo:Convert_Xamarin_XAMLs_to_Maui#UBIKTabView|UBIKTabView]]{{Version/MobileSince|5.1}} should be used instead of the SfTabView going forward, as it supports lazy loading (a performance-boosting feature that only loads tab content on demand). This section is therefore informational only. }}&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29509</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29509"/>
				<updated>2026-03-10T15:41:13Z</updated>
		
		<summary type="html">&lt;p&gt;REP: Restructured wiki from most to least important, added SfTabView and PTR under Mandatory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfTabView ===&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remove Obsolete Converters ====&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Add StringFormatConverter ====&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
==== FontImageSource Styling ====&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TabView Structure ====&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Property Changes ====&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SfPullToRefresh ===&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
==== Namespace Update ====&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rename SfPullToRefresh properties ====&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29508</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29508"/>
				<updated>2026-03-10T14:57:08Z</updated>
		
		<summary type="html">&lt;p&gt;REP: Restructured wiki from most to least important&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfPullToRefresh ==&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Information Only ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=File:UBIK-Standard.zip&amp;diff=29434</id>
		<title>File:UBIK-Standard.zip</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=File:UBIK-Standard.zip&amp;diff=29434"/>
				<updated>2026-03-02T15:07:18Z</updated>
		
		<summary type="html">&lt;p&gt;REP: REP uploaded a new version of File:UBIK-Standard.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Latest version of UBIk-Standard.ttf as of 27 September 2019.&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29349</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29349"/>
				<updated>2026-02-16T09:31:37Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIKTabView */ Added link to SF docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
For more customizing options refer to the [https://help.syncfusion.com/maui-toolkit/tabview/tab-item-customization Syncfusion Documentation].&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfPullToRefresh ==&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29342</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29342"/>
				<updated>2026-02-10T15:34:30Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* XAML Changes And Improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKHighlightColor is a secondary accent color used for highlighting (eg. Multiselect mode or edited Property). It is also combined with UBIKAccentColor to form a gradient on the Authentication area.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). &lt;br /&gt;
*** The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
*** However, this will interfere with lists that rely on the SelectionBackground to highlight selection. This is solved in various ways throughout the UI, such as the SelectedIndicator used in UBIKChildItem, or the seperate SelectedItem and SelectedItemTemplate templates used in UBIKEditGuid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29341</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29341"/>
				<updated>2026-02-10T15:14:11Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Mandatory */ Restructured an unclear section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
There are some other properties that have changed their names on '''SfListView/SfListViewExt'''. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemHolding&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;ItemLongPress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;LeftSwipeTemplate, RightSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;StartSwipeTemplate, EndSwipeTemplate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.LayoutManager&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfPullToRefresh ==&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Version_5.0_(WinX)&amp;diff=29340</id>
		<title>Version 5.0 (WinX)</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Version_5.0_(WinX)&amp;diff=29340"/>
				<updated>2026-02-10T14:59:24Z</updated>
		
		<summary type="html">&lt;p&gt;REP: Added release note for status colors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Attention|This version requires [https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1809_(October_2018_Update) Windows 10 build 17763] or higher}}&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
{{key press|Store}}: Publicly available in Microsoft Store.&lt;br /&gt;
&lt;br /&gt;
{{key press|Store Beta}} / {{key press|Store Preview}}: Publicly available in Microsoft Store as beta or preview versions to those whose account email is participating in our beta or preview test. To join, please send an email to testing@augmensys.com and provide an email address to add to the list as well as the information which test you want to join. Alternatively you can contact the Augmensys staff and submit your chosen email address.&lt;br /&gt;
&lt;br /&gt;
Example: Please add my email account example@example.com to the '''Beta''' test group for the '''WinX''' client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Attention|Some customized XAMLs might need an update to work properly. These changes are marked with ⚠️}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Release Notes =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
=== 5.0.42 on 2026-01-27 {{key press|Store}}  ===&lt;br /&gt;
* Fixed an issue where confirmed work packages are not automatically committed when you switch from offline to online mode.&lt;br /&gt;
* Added a visualization of StatusColor to root and document items that don't additionally have [[MRO_Objects_(Client)#Work_Progress|MRO progress]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.0.41 on 2026-01-14 {{key press|Store}}  ===&lt;br /&gt;
* Fixed an issue where [[MRO_Objects_(Client)#Work_Progress|MRO progress]] is rounded up too aggressively and inconsistent with the mobile clients.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.0.40 on 2025-12-18 {{key press|Store}}  ===&lt;br /&gt;
* Fixed an issue where the deletion of some objects was not reflected in the UI until refresh.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.0.36 on 2025-10-02 {{key press|Store}}  ===&lt;br /&gt;
* Fixed an issue where task direct editing doesn't work the first time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 5.0.35 on 2025-09-29 {{key press|Store}}  ===&lt;br /&gt;
* Updated some translations.&lt;br /&gt;
* Updated the default Demo profile.&lt;br /&gt;
* Updated the notification message about branch download to avoid misunderstanding. When a branch download is in progress, you can work with the offline data which is already available at the time of the download, but any communication with the content server will be scheduled after the branch download is finished.&lt;br /&gt;
* Fixed issue that rendered authentication when editing a geo property impossible.&lt;br /&gt;
* Fixed an issue that triggered a license warning even on a failed login.&lt;br /&gt;
* Fixed an issue where the wizard is shown again when you navigate to a new but saved object offline.&lt;br /&gt;
* Fixed an issue where duplicate notifications are shown when you scan an NFC tag for a supervisor task and no fitting supervisor is found.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
* When editing Guid Link properties, you can no longer further edit the filtering if there are predefined filter parameters (such as the [[Dynamic_Selective_List_(Client)#Dependency_property_values|dependency property values in dynamic selective lists]]). This is because those parameters are to be enforced by design and should not be changed by users. In the future, we might consider a finer level of control over which parameters can be edited in such cases.&lt;br /&gt;
* Free Text Annotations that where created in former sessions cannot be selected and therefore cannot be edited any more.&lt;br /&gt;
* There are still some [[Annotation_and_HotSpot#Known_issues|known issues with free text and text markup annotations]].&lt;br /&gt;
* Known issues regarding the [[Documents_(Client)#Remember_Document_Settings|Remember Document Settings]] feature:&lt;br /&gt;
** Saving the Zoom value via touch gestures is not supported.&lt;br /&gt;
** Due to a third-party framework issue it can't be guaranteed that saving the Zoom level is always working properly. We reported this issue and will update our solution as soon as it is resolved on their side.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ⚠️ XAML Notes =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;headertabs /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category/Version2|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Version 5.0 (WinX)]]&lt;br /&gt;
[[Category:Version 5.0|Version 5.0 (WinX)]]&lt;br /&gt;
[[Category:WinX|Version 5.0 (WinX)]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29258</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29258"/>
				<updated>2026-01-14T10:13:23Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Styles and Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** '''UBIKGradientColor''' is a brighter version of UBIKAccentColor. This can be achieved easily by adding an alpha prefix to the desired Accent color (eg. &amp;quot;#52ff8800&amp;quot; = 32% opacity of color #ff8800), or defined as a different color.&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29257</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29257"/>
				<updated>2026-01-14T10:12:36Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* XAML Changes And Improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Regarding corporate colors, there are now additional resources to customize, aside from UBIKAccentColor;&lt;br /&gt;
** UBIKGradientColor is a brighter version of UBIKAccentColor. This can be achieved easily by adding an alpha prefix to the desired Accent color (eg. &amp;quot;#52ff8800&amp;quot; = 32% opacity of color #ff8800), or defined as a different color.&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'. &lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29256</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29256"/>
				<updated>2026-01-14T09:42:07Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== XAML Changes And Improvements ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'. &lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29255</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29255"/>
				<updated>2026-01-14T09:04:29Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== Main Changes ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'. &lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29254</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29254"/>
				<updated>2026-01-14T09:04:16Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
This section describes the standard UI and how to more easily customize it.&lt;br /&gt;
For differences between Xamarin and Maui, please refer to the [[HowTo:Convert_Xamarin_XAMLs_to_Maui]] article.&lt;br /&gt;
&lt;br /&gt;
== Main Changes ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'. &lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29253</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29253"/>
				<updated>2026-01-13T16:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
== Main Changes ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
* '''SfTextInputLayout''' was introduced and is used in various locations (Authentication, and properties).&lt;br /&gt;
* Default values for size, font, color, etc, were applied to various controls (Picker, Entry etc) for consistency.&lt;br /&gt;
* New '''SfListView''' styles were introduced and the originals moved to the Obsolete section.&lt;br /&gt;
** The listview now has a background color (UBIKMediumElementColor) and child item templates are now responsible for providing their own background color (UBIKBasePageColor that is applied to the Grid style UBIKItemBase). The intention is to provide visual distinction from actual list items and empty list 'space'. &lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
- tbd.&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29252</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29252"/>
				<updated>2026-01-13T15:54:39Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity, both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
== Main Changes ==&lt;br /&gt;
=== Styles and Resources ===&lt;br /&gt;
* Various color elements were renamed for neutrality. This will help clarify the purpose of color themes, and make it easier to keep track of in customizings. The old versions are still available but moved to the Obsolete section of UBIKThemes. &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKDarkTextColor --&amp;gt; UBIKRegularTextColor&lt;br /&gt;
UBIKDarkThemeColor --&amp;gt; UBIKMainThemeColor&lt;br /&gt;
UBIKLightTextColor --&amp;gt; UBIKMainThemeContrastColor&lt;br /&gt;
UBIKLightThemeColor --&amp;gt; UBIKBasePageColor&lt;br /&gt;
UBIKSubtleTextColor --&amp;gt; UBIKMediumTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Furthermore, effort was made to create 'contrast pairs' throughout the client; for example, UBIKMainThemeContrastColor is defined primarily for texts layered on elements of UBIKMainThemeColor (such as the title bar and text). &lt;br /&gt;
** The intention here is that this pair can be safely customized with no surprises, that cannot be guaranteed when using non-paired resource. For example, UBIKMainThemeContrastColor  and UBIKBasePageColor are both white in the default customizing, but if UBIKBasePageColor that were to be layered over UBIKMainThemeColor, it would result in a black-on-black issue in a dark theme customizing. &lt;br /&gt;
** The 'pairs' are; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
UBIKMainThemeColor x UBIKMainThemeContrastColor&lt;br /&gt;
UBIKBasePageColor x UBIKRegularTextColor&lt;br /&gt;
UBIKButtonColor x UBIKButtonTextColor &lt;br /&gt;
UBIKButtonToggledColor x UBIKButtonToggledTextColor &lt;br /&gt;
UBIKPDFBaseColor x UBIKPDFTextColor&lt;br /&gt;
UBIKPDFSelectedToolColor x UBIKPDFSelectedToolTextColor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* An effort was also made to avoid hardcoding numeric values on the client. Reusable resources were introduced instead; &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonIconSize&amp;quot;&amp;gt;20&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonPanelSize&amp;quot;&amp;gt;56&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonSize&amp;quot;&amp;gt;44&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKListItemSize&amp;quot;&amp;gt;80&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKTileItemSize&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;120&amp;quot; Phone=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKCaptionTextSize&amp;quot;&amp;gt;14&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKButtonTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKBodyTextSize&amp;quot;&amp;gt;16&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKTitleTextSize&amp;quot;&amp;gt;18&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;x:Double x:Key=&amp;quot;UBIKProgressBarHeight&amp;quot;&amp;gt;4&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptivePadding&amp;quot; x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;8,0&amp;quot; Phone=&amp;quot;4,0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:Key=&amp;quot;UBIKAdaptiveSpacing&amp;quot; x:TypeArguments=&amp;quot;x:Double&amp;quot; Default=&amp;quot;16&amp;quot; Phone=&amp;quot;8&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As in WinX {{Version/WinXSince|4.0}}, the various possible object status indicators were exported to a template called '''StatusIndicators''' located in UBIKThemes. These are now displayed at the top right of the item template, with a semi-opaque underlay in case the indicators appear over Title/SubTitle text.&lt;br /&gt;
&lt;br /&gt;
- ListView and item color&lt;br /&gt;
&lt;br /&gt;
=== Adaptivity ===&lt;br /&gt;
&lt;br /&gt;
=== Layout and Functionality ===&lt;br /&gt;
* '''UBIKNavigationBar''' was introduced as a templatable alternative to the hardcoded context menu (accessed by the '...' button in the top right of the content area) and is fully customizable.&lt;br /&gt;
* Shadowed panels were introduced in place of floating buttons in the content tabs (Children, Properties). For consistency, both are located at the top of their respective tab content.&lt;br /&gt;
* '''UBIKChildItem''' was visually simplified. It now displays a simple icon, the Title (and MRO progress, if any) and Subtitle, and StatusIndicators in the top right. The progressbar is now displayed across the bottom of the item.&lt;br /&gt;
* '''UBIKTaskItem''' was completely redesigned. &lt;br /&gt;
** Aside from the StatusIndicators that appear in the top right uniformly on any context object, MRO-related ones (Task status (Finished, NA, or Not Necessary, Group Limit and Size, Previous Value, and Tech Indicator) appear on the top left contained in an SfChipGroup. &lt;br /&gt;
** The main area of the task item is previously split between Title and task-related input. On smaller devices or in editing regardless of screen size, the input area sizes becomes larger.&lt;br /&gt;
** The task related input now looks visually distinct with and without a value. UBIKButton(Text)Color is used for 'new' tasks, while UBIKButtonToggled(Text)Color is used for the 'value filled' state.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
* '''UBIKRootItem''' (formerly UBIKMainItem) was introduced simply so that the Title, Area, and Item are organized together within the default and customizing folders. For compatibility, UBIKMainItem still exists in the default folder, however, be aware that the listview in UBIKRootArea now requests UBIKRootItem as the ItemTemplate by default.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29251</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29251"/>
				<updated>2026-01-13T15:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity, both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
== Customizing Guides ==&lt;br /&gt;
=== Dark Theme ===&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Increased FontSize ===&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29250</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29250"/>
				<updated>2026-01-13T15:07:48Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} */ Adding dark theme cookbook&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity, both to visually update the client's default UI, and to add some quality of life changes aiming to reduce the amount of customizing needed.&lt;br /&gt;
&lt;br /&gt;
== Dark Theme ==&lt;br /&gt;
While UBIK Go does not include a Dark Theme by default, a lot of effort was invested in optimizing the color resources used throughout the app, so that a dark theme can be quickly customized. Furthermore, below is a list of recommended changes that result in a functional dark theme.&lt;br /&gt;
&lt;br /&gt;
'''In UBIKThemes:'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;InterL&amp;lt;/x:String&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the value for TextFontFamily with &amp;quot;InterL&amp;quot;; It is recommended to use a thinner font as white on black looks bolder than the inverse.&lt;br /&gt;
A 'Light' version of the default font font was added and can be accessed using the tag InterL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKRegularTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMediumTextColor&amp;quot;&amp;gt;#A3ffffff&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBasePageColor&amp;quot;&amp;gt;#3a3a3c&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKMainThemeColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKBorderColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKElementColor&amp;quot;&amp;gt;#2c2c2e&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKLightElementColor&amp;quot;&amp;gt;#222124&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKFinishedElementColor&amp;quot;&amp;gt;#2a2a2b&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKOverlayElementColor&amp;quot;&amp;gt;#3D000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKImageOverlayColor&amp;quot;&amp;gt;#A3000000&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt; &lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKButtonToggledTextColor&amp;quot;&amp;gt;Black&amp;lt;/Color&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFSelectedToolTextColor&amp;quot;&amp;gt;#292929&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFTextColor&amp;quot;&amp;gt;White&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKPDFBaseColor&amp;quot;&amp;gt;#181719&amp;lt;/Color&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Replace the above color resources (or similar).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Shadow&lt;br /&gt;
        x:Key=&amp;quot;UBIKPanelShadow&amp;quot;&lt;br /&gt;
        Brush=&amp;quot;Black&amp;quot; ... /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Change the value for the attribute Brush to &amp;quot;Black&amp;quot; to darken the panel shadows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Color x:Key=&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;&amp;gt;#636365&amp;lt;/Color&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;UBIKProgressBar&amp;quot; TargetType=&amp;quot;controls:ProgressBar&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;StatusColor&amp;quot; Value=&amp;quot;{Binding ClassificationHandler.StatusColor, Converter={StaticResource IntToColor}, ConverterParameter={StaticResource UBIKProgressBarUndefinedStatuscolor}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The light theme uses UBIKElementColor for the progress bar color when none is defined on the server. However, this does not invert well in a dark theme. Therefore a new color resource should be introduced (&amp;quot;UBIKProgressBarUndefinedStatuscolor&amp;quot;) and used in the ConverterParameter of the IntToColor converter, which does not accept a color hex code directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''In UBIKSplashArea:'''&lt;br /&gt;
&lt;br /&gt;
Follow the instructions embedded within the file to replace the splash image with a custom logo. Alternatively, simply adapt the Source attribute of the Image control to &amp;quot;splashlogoinverse.png&amp;quot; to apply an inversion of the UBIK Go logo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Increased FontSize ==&lt;br /&gt;
tbd.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29248</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29248"/>
				<updated>2026-01-13T14:13:43Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* UBIK Go (Maui) Customizing Guide {{Version/WinXSince|5.1}} */ Corrected wrong Since flag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/MobileSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity to visually update the client's default UI.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29247</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29247"/>
				<updated>2026-01-13T14:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;REP: Adding a section on the new standard UI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= UBIK Go (Maui) Customizing Guide {{Version/WinXSince|5.1}} =&lt;br /&gt;
The change to Maui was taken as an opportunity to visually update the client's default UI.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29235</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29235"/>
				<updated>2025-12-15T09:17:39Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Highly Recommended */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== New name for Root item templates ===  &lt;br /&gt;
The template formerly called UBIKMainItem has been renamed to UBIKRootItem for consistency.&lt;br /&gt;
The renaming is not mandatory in customizing, however, ensure that the ItemTemplate requested in UBIKRootArea matches the file intended to be used for visualizing root items.&lt;br /&gt;
&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKTabView ===&lt;br /&gt;
UBIKTabView has been adapted so that it now supports lazy loading when used in combination with a UBIKContentView or ContentControl. This results in a performance boost because the contents of non-selected tabs are no longer rendered in the UI automatically unless the tab is explicitly selected by the user. Therefore, the LazyLoading property should be set to true for tabs that are not the “default” tabs—i.e., tabs that are not initially selected when a page is opened (Property or Document tabs).&lt;br /&gt;
&lt;br /&gt;
Add the following namespace to use the UBIKTabView:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''From a performance perspective, our UBIKTabView should be used instead of the SfTabView going forward, as it supports lazy loading.'''{{Version/MobileSince|5.1}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; table-layout:fixed;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:60%;&amp;quot; | Xamarin&lt;br /&gt;
! style=&amp;quot;width:40%;&amp;quot; | MAUI&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKPropertyArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
            &amp;lt;ContentView Content=&amp;quot;{Binding [UBIKDocumentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;controls:UBIKTabView&lt;br /&gt;
    x:Name=&amp;quot;ContentTabs&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource TabViewBaseStyle}&amp;quot;&lt;br /&gt;
    TabHeaderPadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; &lt;br /&gt;
                Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
            &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
                &amp;lt;controls:UBIKContentView&lt;br /&gt;
                    Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
                    ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
                    LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKTabView.Items&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
'''There are some other properties that have changed their names on SfListView/SfListViewExt. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
SfListViewExt:&lt;br /&gt;
    * ItemHolding&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ItemLongPress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| * LeftSwipeTemplate, RightSwipeTemplate&lt;br /&gt;
| StartSwipeTemplate, EndSwipeTemplate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Layout name change ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;sync:SfListView.LayoutManager&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfPullToRefresh ==&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29233</id>
		<title>Mobile XAML</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=Mobile_XAML&amp;diff=29233"/>
				<updated>2025-12-12T11:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Delay and LazyLoading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The User Interface of the Mobile Clients (Android, iOS, Windows) can be fundamentally customized using custom XAML definitions. This customization process is heavily influenced by the [[XAML|XAML Customization Process on the WinX Client]].&lt;br /&gt;
&lt;br /&gt;
= Basics =&lt;br /&gt;
There are predefined XAML templates available that can be customized. If no customizing is found, the default templates will be used.&lt;br /&gt;
&lt;br /&gt;
== Default XAMLs ==&lt;br /&gt;
All default XAML templates that can be customized are available through the Mobile Windows client. You need to go to the app settings and click the &amp;quot;Unpack default XAMLs&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Differences to WinX/UWP ==&lt;br /&gt;
* Since it's based on the Mobile XAML dialect, you CANNOT use any existing XAML customizings for the WinX/UWP app;&lt;br /&gt;
* Namespace definitions must include the corresponding assembly names;&lt;br /&gt;
* XAML template files have the extension name of '''xamlx''' instead of '''xaml''';&lt;br /&gt;
* You can deploy only those resources that you want to customize. (This is also the case for newer versions of WinX/UWP. {{Version/WinXSince|3.6}})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding default XAMLs=&lt;br /&gt;
On Windows (WinX/UWP), the &amp;lt;code&amp;gt;[App Package Folder]/LocalState/xaml/&amp;lt;/code&amp;gt; folder can be accessed by the user and the customized XAML files directly added. An alternative to this on all platforms (including Android, iOS, etc.) is to use the ''Import Customizing'' button in the app settings to import the templates, styles, images, etc. (file by file, or all files within a zip package). The changes should be reflected in the UI (except the current page) without restarting the app. After directly editing the customizings (Mobile Windows), you can also use the &amp;quot;Reload customizing&amp;quot; button without restarting the app.&lt;br /&gt;
&lt;br /&gt;
In the following, we're going to override the default light theme color of the app:&lt;br /&gt;
* Unpack the default XAMLs;&lt;br /&gt;
* Pick and deploy the default UBIKThemes.xamlx to the '''xaml''' folder inside the ''LocalState'' folder;&lt;br /&gt;
* Open it with the text editor of your choice and remove everything within the '''ResouceDictionary''' except &amp;lt;code&amp;gt;&amp;lt;Color x:Key=&amp;quot;UBIKLightThemeColor&amp;quot;&amp;gt;blue&amp;lt;/Color&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Save the changes and reload. You should see changes successfully implemented.&lt;br /&gt;
&lt;br /&gt;
{{Attention| For maintainability reasons, it's HIGHLY recommended to deploy only those XAML resources you want to override. For example, if you only want to customize the UBIKChildArea, don't deploy others like the UBIKMenuArea. If you only want to customize the UBIKChildItem, that's the only content you should include in the UBIKThemes.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Templates ==&lt;br /&gt;
Custom templates can be added, just like on the WinX/UWP client. Make sure to include all '''namespace definitions''' (as attributes of the '''ContentView''' tag), otherwise the custom template will not load.&lt;br /&gt;
&lt;br /&gt;
Similar to the ''UBIKThemes.xamlx'' file, custom or overridden templates start with a &amp;lt;code&amp;gt;&amp;lt;ContentView&amp;gt;&amp;lt;/code&amp;gt; tag containing all '''namespaces'''. &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; takes a '''ResourceDictionary''' and contains resources like references to converters. Finally, &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; contains the actual layout content (it's best to start with a '''Grid'''). Again, don't forget to add namespaces that you need!&lt;br /&gt;
&lt;br /&gt;
Templates can also be defined in ''UBIKThemes.xamlx''. In this case, they need to be added into the &amp;lt;code&amp;gt;&amp;lt;ResourceDictionary&amp;gt;&amp;lt;/code&amp;gt; inside the &amp;lt;code&amp;gt;&amp;lt;ContentView.Resources&amp;gt;&amp;lt;/code&amp;gt; template as a &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt;. Similarly, if you want to split up the templates into seperate files, you need to make sure to follow the steps mentioned above and get the content of the &amp;lt;code&amp;gt;&amp;lt;DataTemplate&amp;gt;&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;&amp;lt;ContentView.Content&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Templates defined in separate files will override templates defined in the ''UBIKThemes.xamlx''!}}&lt;br /&gt;
&lt;br /&gt;
=== Bindings in resources ===&lt;br /&gt;
When using bindings such as [[Xamarin_XAML#Content_filtering|this]] in a resource located in a custom template, it is necessary to place the template in a UBIKContentView.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Technically speaking, this is because bindable objects in the ResourceDictionary of a ContentView (the custom template) don't automatically inherit the BindingContext from the container/parent view. UBIKContentView is created to additionally do that.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- UBIKCustomView.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt... ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Container where UBIKCustomView is placed, e.g. UBIKChildArea.xamlx --&amp;gt;&lt;br /&gt;
&amp;lt;ContentView...&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;controls:UBIKContentView Content=&amp;quot;{Binding [UBIKCustomView], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding Images ==&lt;br /&gt;
Images can't be loaded with the default '''Image''' tag, as the image is on different paths on each operating system.&lt;br /&gt;
&lt;br /&gt;
Therefore, there's a custom '''FileImage''' that internally overrides the default ''Image'' with two custom parameters:&lt;br /&gt;
* '''FolderName''' ...The name of the '''folder''' in the '''local folder'''. Only the first level inside the ''LocalState'' folder seems to work.&lt;br /&gt;
* '''FileName''' ...The name of the '''file''' in the said folder. &lt;br /&gt;
&lt;br /&gt;
Make sure to implement the proper namespace as well by adding&lt;br /&gt;
&amp;lt;code&amp;gt;xmlns:fimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; into the root item's attributes.&lt;br /&gt;
&lt;br /&gt;
Then, the image can be loaded using:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;fimage:FileImage FileName=&amp;quot;image.png&amp;quot; FolderName=&amp;quot;xaml&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This snipped loads the image called '''image.png''' located in the '''xaml''' folder inside the ''LocalState''.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the ''FileImage'' tag doesn't seem to support most attributes. Therefore place it inside a '''Grid''' to achieve a perfect layout.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Custom Icons ==&lt;br /&gt;
Moved to article [[XAML_Tips#Custom_Icons]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Converters==&lt;br /&gt;
:''Main Page: [[Converters_In_Mobile]]''&lt;br /&gt;
&lt;br /&gt;
They are used to convert specific data into some desired output, using custom logic. &lt;br /&gt;
&lt;br /&gt;
Consider the following example:&amp;lt;br/&amp;gt;&lt;br /&gt;
A label saying ''There are no children items available!'' should only be visible if the number of children-items is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
&lt;br /&gt;
== Feature related ==&lt;br /&gt;
&lt;br /&gt;
=== Customizing Menu Button {{Version/XamarinSince|4.6.0}} === &lt;br /&gt;
&lt;br /&gt;
For the Mobile Client, it is possible to show/hide the '''Menu button''' of the client.&amp;lt;br&amp;gt;&lt;br /&gt;
To customize the visibility of the '''Menu button''' you have to edit the default XAML '''Themes''' file.&lt;br /&gt;
&lt;br /&gt;
* Search for &amp;quot;'''ShowMenuToolBar'''&amp;quot; in the Themes file.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If there isn't any &amp;quot;'''ShowMenuToolBar'''&amp;quot; in your XAML Themes file, you just have to create one, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:Boolean x:Key=&amp;quot;ShowMenuToolBar&amp;quot;&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the value to &amp;quot;true&amp;quot; to show the '''Menu button''' (default value).&lt;br /&gt;
* Set the value to &amp;quot;false&amp;quot; to hide the '''Menu button'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
File:menu_button_show.png|Menu Button shown&lt;br /&gt;
File:menu_button_hiddenV3.png|Menu Button hidden&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Content filtering ===&lt;br /&gt;
For the Mobile clients, an &amp;quot;SfDataSourceExt&amp;quot; type is available for filtering list of items using defined expressions.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example demonstrates how to filter for child items having certain property values. The filtered list and its count can be displayed in the UI.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;Item.Values[&amp;amp;quot;MP_YEAR&amp;amp;quot;].Contains(&amp;amp;quot;2019&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt  x:Key=&amp;quot;FilteredList&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding DisplayItemsCount, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilteredList}}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes on using bindings in ResourceDictionary ====&lt;br /&gt;
In the example shown above, you can see &amp;lt;code&amp;gt;{Binding Children.Items}&amp;lt;/code&amp;gt; is used. For this to work, the SfDataSourceExt control inside the ResourceDictionary must inherit the binding data context properly.&lt;br /&gt;
* In this case, that data context comes from where this template (UBIKChildArea.xamlx) is used, namely the UBIKContentArea.xamlx;&lt;br /&gt;
* When referencing this template in a ContentView control, the binding data context is '''NOT''' automatically inherited by the controls inside the ResourceDictioinary;&lt;br /&gt;
* That's why we use a UBIKContentView control instead. You can find its example usage in the default UBIKContentArea.xamlx template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Search ===&lt;br /&gt;
In the default UBIKMenuArea.xamlx (where the search UI is hosted), there are two commands associated with two events. See below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SearchBar ...&amp;gt;&lt;br /&gt;
    &amp;lt;SearchBar.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior&lt;br /&gt;
            Command=&amp;quot;{Binding FreeTextSearchCommand}&amp;quot;&lt;br /&gt;
            CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference SearchField}}&amp;quot;&lt;br /&gt;
            EventName=&amp;quot;SearchButtonPressed&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding DelayedFreeTextSearchCommand}&amp;quot; EventName=&amp;quot;TextChanged&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/SearchBar.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/SearchBar&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;SearchButtonPressed&amp;lt;/code&amp;gt; is responsible for executing searches after the user confirms the input (e.g. pressing {{{keypress|Enter}}} or the search button).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The one for &amp;lt;code&amp;gt;TextChanged&amp;lt;/code&amp;gt; is responsible for the &amp;quot;search as you type&amp;quot; behavior. Namely it triggers an automatic search shortly (half second) after the user stops changing the text in the search bar. It can be turned off by simply removing that particular behavior.&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display custom views]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
To get a good performance in the app UI when using your Xaml customizings, it is recommended to try the following.&lt;br /&gt;
* Always keep your UI structure simple. Choose the most efficient layouts for the scenarios and avoid unnecessary UI elements. Please refer to [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#choose-the-correct-layout &amp;quot;choose the correct layout&amp;quot;] and [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance#reduce-the-visual-tree-size &amp;quot;reduce the visual tree size&amp;quot;];&lt;br /&gt;
* Turn on [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-compression layout compression] on wrapping elements that don't have any visual parameters set (reasons stated in the linked documentation).&lt;br /&gt;
{{Hint|There is a default &amp;quot;HeadlessLayout&amp;quot; style available in the app you can use on elements such as Grids, StackLayouts, ContentViews, etc. It turns on [[Xamarin_XAML#Layout_compression_examples|layout compression]] on the applied elements in Xamarin.Android (since we find it not worth the effort in Xamarin.iOS).}}&lt;br /&gt;
{{Attention|If possible, one should always favor designing the UI with less wrapping elements over turning on layout compression on unnecessary ones.}}&lt;br /&gt;
&lt;br /&gt;
=== General performance tips ===&lt;br /&gt;
* Reduce number of views per page&lt;br /&gt;
* Don’t bind things if they could be set static easily&lt;br /&gt;
* If you do not change the default, don’t set it explicit. For example, [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.StackLayout.Orientation?view=xamarin-forms Orientation of StackLayout] is “Vertical” by default. No need to set it manually if you don’t want to change it.&lt;br /&gt;
* Transparency is expensive.&lt;br /&gt;
* Use async/await to avoid blocking user interface.&lt;br /&gt;
* Do not put ListViews into ScrollViews.&lt;br /&gt;
* To stack elements, create a grid and add them to the same cell one after another. It’s cheaper than RelativeLayout.&lt;br /&gt;
* Use Margins instead of Paddings.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
* Choose correct Layout, e.g. no need to add a StackLayout if it only has 1 child.&lt;br /&gt;
* [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/layout-options LayoutOptions].Fill or .FillAndExpand are best choice in most cases. And they are already default, so no need to set.&lt;br /&gt;
* Autosize of rows and columns in grids should used as few as possible.&lt;br /&gt;
* RelativeLayout is very expensive. Try to avoid.&lt;br /&gt;
* In StackLayout, make sure there is only 1 LayoutOptions Expand.&lt;br /&gt;
&lt;br /&gt;
=== Labels ===&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/label#formatted-text FormattedText] instead of multiple labels.&lt;br /&gt;
* Use [https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.linebreakmode?view=xamarin-forms Linebreakmode] NoWrap (which is already the default).&lt;br /&gt;
* Avoid [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Label.VerticalTextAlignment?view=xamarin-forms VerticalTextAlignment]. Anyway, if needed, use VerticalTextAligment instead of &lt;br /&gt;
VerticalOptions.&lt;br /&gt;
* Use the &amp;quot;TextTransform&amp;quot; attribute to convert the value of the &amp;quot;Text&amp;quot; attribute to either uppercase or lowercase.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&lt;br /&gt;
      TextTransform=&amp;quot;Uppercase&amp;quot;&lt;br /&gt;
      Text=&amp;quot;{Binding Properties.AllItems[DESCR].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
* Provide images in optimized width and size. Provide multiple resolutions for different usage.&lt;br /&gt;
* Set [https://docs.microsoft.com/en-us/dotnet/api/Xamarin.Forms.Image.IsOpaque?view=xamarin-forms IsOpaque] to true if image is opaque.&lt;br /&gt;
&lt;br /&gt;
=== Layout compression examples ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource ChangedSymbol}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The code above removes one wrapping element added automatically by the ContentView and demonstrates a good reason to use layout compression because it can not be avoided otherwise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid Margin=&amp;quot;2&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Margin=&amp;quot;5&amp;quot; Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This example, on the other hand, demonstrates a bad usage of layout compression because it can be easily achieved by better designs such as using only the Label with a merged margin.&lt;br /&gt;
&lt;br /&gt;
Sometimes the content inside a compressed layout appears on a wrong z-index level. For eample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView CornerRadius=&amp;quot;14&amp;quot; HeightRequest=&amp;quot;28&amp;quot; WidthRequest=&amp;quot;28&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;ContentView ControlTemplate=&amp;quot;{DynamicResource Badge}&amp;quot; Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView &amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
According to the order of the BoxView and the Label, the latter should appear on top of the former (later ones have higher z-index levels). However, this can be disturbed by layout compression, causing the exact opposite.&lt;br /&gt;
In this case, you can add a &amp;lt;code&amp;gt;xmlns:android=&amp;quot;clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&amp;quot;&amp;lt;/code&amp;gt; namespace to your Xaml file and manually elevate the Label by specifying &amp;lt;code&amp;gt;android:VisualElement.Elevation=&amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; on it accordingly (X is the delta of the z-index level you want).&lt;br /&gt;
&lt;br /&gt;
=== SfListViewExt ===&lt;br /&gt;
For performance reasons, we created an extended version of the Syncfusion SfListView control and it should be used for all lists in customizings. You need to add a namespace like &amp;lt;code&amp;gt;xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&amp;lt;/code&amp;gt; to your Xaml file and use it like &amp;lt;code&amp;gt;&amp;lt;controls:SfListViewExt ... /&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hint|Technically speaking, SfListViewExt informs item view models when their corresponding item views appear on / disappear from the screen. This way, view models can skip a lot of unnecessary work (on the UI) when their views are not visible. '''If SfListView is used instead, the item views will not reflect content changes until the page is reloaded/refreshed.'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the ListView, that the ScrollPosition is remembered when navigating away from the page, to do so, the property RembemberScrollPosition needs to be set to true. If unset, the value defaults to false and the scroll positions are not remembered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt RememberScrollPosition=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using multiple Lists on one page (e.g. in a TabbedView), it is necessary to set the AutomationId property uniquely for each list on the page, to support the remembering of the ScrollPosition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delay and LazyLoading ===&lt;br /&gt;
{{Attention|Although both properties can be set in XAML on the two controls, this should not be done. When both the LazyLoading and Delay properties are set, the Delay property is ignored in the code-behind, as otherwise it could lead to unexpected behavior and, in the worst case, result in performance degradation.}}&lt;br /&gt;
&lt;br /&gt;
==== Delay in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
More complex UIs create a delay in rendering which leads to a feeling of &amp;quot;unresponsiveness&amp;quot; when navigating through the client. This is because the app loads and displays everything at once, leading to a larger delay between triggering navigation and completion of page loading.&lt;br /&gt;
 &lt;br /&gt;
While the complexity of the UI directly affects the time taken to render it, the experience of responsiveness can be somewhat improved by actually adding a delay between the loading of the content page, and actual data content (properties, children, etc). By not loading both at once, resources are freed up in the app, leading to a quicker loading of the basic page. The content then loads in at its normal speed.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Starting from version 5.1, a small delay was introduced in the content heavy pages (child page, document page and query page). However, additional delays can also be applied to the custom UI at will, using a new property added to two existing controls used to insert UI templates: UBIKContentView and ContentControl. You can specify a delay (in milliseconds) on both controls so that the content of them is loaded after that amount of time. Examples are shown below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl &lt;br /&gt;
    Delay=&amp;quot;50&amp;quot; &lt;br /&gt;
    ContentTemplate=&amp;quot;{Binding [UBIKNavigationBar], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|The delay won't have any effect if you specify the Content of the UBIKContentView control instead of its Converter, because the Content is immediately laid out by the XAML framework that way. If you don't need a converter to determine the actual template name dynamically, you can still use the TemplateConverter and specify the template name like the following so that the delay applies.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay applies ✅&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; ConverterParameter=&amp;quot;UBIKChildArea&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Delay doesn't apply ❌&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView Delay=&amp;quot;50&amp;quot; Content=&amp;quot;{Binding [UBIKChildArea], Source={x:Static services:TemplateService.Instance}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lazy Loading in UBIKContentView and ContentControl {{Version/MobileSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
To further improve performance, it is now possible to apply LazyLoading to UBIKContentView and ContentControl. &lt;br /&gt;
&lt;br /&gt;
When a ContentTemplate is assigned to either of these controls and the LazyLoading property is set to true, the content is only loaded when it is explicitly requested. The difference between this and simply controlling the IsVisible condition is that in the latter, resources are still consumed in constructing the UI element, even though it is not shown. Note that Lazy loading requires a trigger to determine when the content should be loaded, and the biggest benefit is experienced when complex elements, especially those hosting a ListView or some kind of object/property collection, are lazy-loaded. &lt;br /&gt;
&lt;br /&gt;
UBIKTabView is optimized to make use of the LazyLoading attribute when it is applied to tab content. Additionally, usage outside of UBIKTabView is possible, as the loading can be triggered as a behavior attached to any other control, such as a button with an IsClicked behavior handler. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''UBIKTabView with LazyLoading'''&lt;br /&gt;
&lt;br /&gt;
When used in combination with UBIKTabView (by including the LazyLoading=True attribute on any UBIKContentView or ContentControl content of a tab item, as is now standard {{Version/MobileSince|5.1}}), only the content of the selected tab is rendered (by default, the first tab). The content of non-selected tabs is not. When switching tabs, UBIKTabView takes care of triggering the rendering of the content for the newly selected tab. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UBIKContentView&lt;br /&gt;
! ContentControl&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView &lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot; &lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKPropertyArea&amp;quot; &lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:ContentControl &lt;br /&gt;
            ContentTemplate=&amp;quot;{DynamicResource MyTemplate}&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
 &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Using another control as a trigger for lazy loading'''&lt;br /&gt;
&lt;br /&gt;
Other controls (e.g., Button, CheckBox, etc.) can also serve as triggers for lazy loading. The benefit of this is that LazyLoading can still be applied to a complex UBIKContentView or ContentControl that is not hosted within a UBIKTabView. &lt;br /&gt;
&lt;br /&gt;
And example of a usecase is a togglebutton that reveals a section of content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;Grid RowDefinitions=&amp;quot;*,50,*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&lt;br /&gt;
            x:Name=&amp;quot;LoadDocuments&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;1&amp;quot;&lt;br /&gt;
            HeightRequest=&amp;quot;50&amp;quot;&lt;br /&gt;
            HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
            Text=&amp;quot;LazyLoadDocuments&amp;quot;&lt;br /&gt;
            WidthRequest=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Clicked&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;behaviors:InvokeMethodAction MethodName=&amp;quot;TriggerLazyLoad&amp;quot; TargetObject=&amp;quot;{Binding Source={x:Reference DocumentsAreaLoader}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
            &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controls:UBIKContentView&lt;br /&gt;
            x:Name=&amp;quot;DocumentsAreaLoader&amp;quot;&lt;br /&gt;
            Grid.Row=&amp;quot;2&amp;quot;&lt;br /&gt;
            Converter=&amp;quot;{StaticResource TemplateConverter}&amp;quot;&lt;br /&gt;
            ConverterParameter=&amp;quot;UBIKDocumentArea&amp;quot;&lt;br /&gt;
            LazyLoading=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
= Known issues =&lt;br /&gt;
&lt;br /&gt;
=== Headlesslayout style in custom UBIKThemes causing problems ===&lt;br /&gt;
&lt;br /&gt;
In our default '''UBIKThemes''', we are currently using this style for a headless layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Mobile(Xamarin):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;OnPlatform&lt;br /&gt;
                x:TypeArguments=&amp;quot;x:Boolean&amp;quot;&lt;br /&gt;
                Android=&amp;quot;True&amp;quot;&lt;br /&gt;
                WinPhone=&amp;quot;False&amp;quot;&lt;br /&gt;
                iOS=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
    &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This style is used for better UI performance on Android.&lt;br /&gt;
Using this style in a '''custom UBIKThemes''' could cause an exception &amp;amp; an app crash, or some objects to disappear.&lt;br /&gt;
The best case would be to '''not''' include it in the custom themes file, as it's unnecessary if you don't want to make any changes here.&lt;br /&gt;
&lt;br /&gt;
'''This issue is only known on Android tablet devices.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;br /&gt;
&lt;br /&gt;
=== DataTrigger Issues ===&lt;br /&gt;
==== Conflicting Triggers ====&lt;br /&gt;
DataTriggers in Mobile function better than the equivalent DataTriggerBehavior in UWP as they automatically handle the opposite case when a Boolean attribute value is set. This means that if a boolean DataTrigger is set, such as IsVisible=True, the False visibility will automatically be set if the Binding/Value condition is not met.&lt;br /&gt;
&lt;br /&gt;
However, this means that stacking multiple DataTriggers on the same attribute can lead to unexpected results. For this reason, it is recommended to use as few DataTriggers as possible. &lt;br /&gt;
* Avoid setting the same attribute more than once; do not set the same value as a default attribute and in the DataTrigger (ControlTemplate in the below example).&lt;br /&gt;
* Ideally, use only DataTriggers without a default ControlTemplate. This ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
* It is acceptable, but not recommended, to combine a single DataTrigger with an opposite default value, but only if the default value is different from all values set in triggers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead Do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource SelListTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Acceptable, but not recommended&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;editorValueContainer&amp;quot; ControlTemplate=&amp;quot;{StaticResource SelListTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
    &amp;lt;DataTrigger Binding=&amp;quot;{Binding Source={x:Reference editorValueContainer}, Path=BindingContext.PropertyViewModel.ShowComboBox}&amp;quot; TargetType=&amp;quot;ContentView&amp;quot; Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource TextTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
  &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DataTrigger to set Footer Properties in a ListView ====&lt;br /&gt;
&lt;br /&gt;
When using a DataTrigger to set the properties of a footer for a ListView, the sequence of the properties inside the DataTrigger might matter in some cases.&lt;br /&gt;
It seems to occur since Version 4.4 due to a Syncfusion update and could lead to the page not being rendered properly and appearing empty.&lt;br /&gt;
&lt;br /&gt;
If you encounter such an issue, please workaround by adding the IsStickyFooter Property Setter on top inside the DataTrigger.&lt;br /&gt;
Also, new customizings should consider this workaround as a preventive action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK IN CERTAIN CASES --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt ...&amp;gt;&lt;br /&gt;
	&amp;lt;controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
		&amp;lt;DataTrigger TargetType=&amp;quot;controls:SfListViewExt&amp;quot; Binding=&amp;quot;{Binding Title}&amp;quot; Value=&amp;quot;Administration&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;IsStickyFooter&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterTemplate&amp;quot; Value=&amp;quot;{DynamicResource AddLoginFooter}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;Setter Property=&amp;quot;FooterSize&amp;quot; Value=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:SfListViewExt.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Incorrect glyphs may be shown on buttons ===&lt;br /&gt;
&lt;br /&gt;
When using glyphs on buttons in Mobile, sometimes a different glyph than the expected one will show up when viewing the app on Android.&lt;br /&gt;
They only seem to appear incorrectly when used as the Text property of the button (with FontFamily set to UBIKSymbols, such as the UBIKIconButton style.)&lt;br /&gt;
&lt;br /&gt;
If you encounter this issue please workaround by supplying the icon through the FontImageSource property of the button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding BulkOperation.InvokeOnItemsCommand}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Button.ImageSource&amp;gt;&lt;br /&gt;
          &amp;lt;FontImageSource &lt;br /&gt;
               FontFamily=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot;&lt;br /&gt;
               Glyph=&amp;quot;{x:Static resources:UBIKIcons.MobileDelete}&amp;quot;&lt;br /&gt;
               Color=&amp;quot;{DynamicResource UBIKDarkThemeColor}&amp;quot;&lt;br /&gt;
               Size=&amp;quot;22&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.ImageSource&amp;gt;&lt;br /&gt;
     &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;classes:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;DiscardContentCommand&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
     &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Buttons and gesture recognizers ===&lt;br /&gt;
In Mobile XAML, you can use gesture recognizers on many UI elements such as a Grid to enable the latter to interact with user inputs.&lt;br /&gt;
&lt;br /&gt;
However, we've already made quite a lot of experience that gesture recognizers do not always work on Android and iOS when used on a Button control.&lt;br /&gt;
For example, the following Button won't properly invoke the command on said platforms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS DOESN'T WORK!!! --&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Therefore, you should always seek alternatives for Buttons.&lt;br /&gt;
'''If only one command is needed''', use the standard Command property on the Button, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Or if multiple commands are needed, use Behaviors '''instead''', e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- THIS ALSO WORKS --&amp;gt;&lt;br /&gt;
&amp;lt;Button xmlns:behaviors=&amp;quot;clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&amp;quot; ...&amp;gt;&lt;br /&gt;
    &amp;lt;Button.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding ReplicateAsDataCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventToCommandBehavior Command=&amp;quot;{Binding NavigateBackCommand}&amp;quot; EventName=&amp;quot;Clicked&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== No dynamic reloading of Document Viewer ===&lt;br /&gt;
[[File:PDFViewerFixWiki.JPG]]&lt;br /&gt;
&lt;br /&gt;
In a customizing that combines a single-selection list of documents with some kind of viewer (especially UBIKDocumentContentArea), it is generally the case that switching the document causes the document viewer to then appear blank. The technical reason is that the PDFViewer used in the UBIKDocumentContentArea is not reloaded once the document content is reloaded. &lt;br /&gt;
&lt;br /&gt;
An easy fix is to apply a DataTrigger that unloads the ContentView when the document content is null, as the ContentView is forced to rerender itself when the trigger condition is no longer met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Document Viewer --&amp;gt;&lt;br /&gt;
&amp;lt;controls:UBIKContentView &lt;br /&gt;
    x:Name=&amp;quot;DoucmentViewer&amp;quot; &lt;br /&gt;
    BindingContext=&amp;quot;{Binding SelectedItem, Source={x:Reference DocumentList}}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding [UBIKDocumentContentArea], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger TargetType=&amp;quot;controls:UBIKContentView&amp;quot; Binding=&amp;quot;{Binding SelectedItem.DocumentViewModel.DocumentContent, Source={x:Reference DocumentList}, Converter={StaticResource NullToBool}}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;Content&amp;quot; Value=&amp;quot;{x:Null}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:UBIKContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:UBIKContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Issues with SfPullToRefresh in Mobile client {{Version/MobileSince|5.0}} ===&lt;br /&gt;
Due to a third-party issue, problems may occur on Mobile Android when using the SfPullToRefresh control in combination with the SfListViewExt. This can result in e.g. navigation or task interaction sometimes requiring multiple clicks.&lt;br /&gt;
In general, and due to more issues, it's not recommended to use the SfPullToRefresh control.&lt;br /&gt;
In our Mobile standard client, the PullToRefresh control has been replaced by a Refresh button in the Context Menu.&lt;br /&gt;
If you still decide to use SfPullToRefresh, there are a few points to consider:&lt;br /&gt;
&lt;br /&gt;
==== Avoid multiple SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_multiple_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
==== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ====&lt;br /&gt;
To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control. Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control. For an example, refer to [[HowTo:Convert_Xamarin_XAMLs_to_Maui#Avoid_using_SyncFusion_ListViews_directly_in_SfPullToRefresh_controls|this link]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Xamarin XAML]]&lt;br /&gt;
[[Category:Mobile|Mobile XAML]]&lt;br /&gt;
[[Category:Pages with broken file links|Xamarin XAML]]&lt;br /&gt;
[[Category:Styling|Xamarin XAML]]&lt;br /&gt;
[[Category:XAML|Xamarin XAML]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29135</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=29135"/>
				<updated>2025-11-11T09:15:31Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Frame to Border */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use [https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-9.0 Border] instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Attributes;&lt;br /&gt;
* Stroke (previously BorderColor)&lt;br /&gt;
* Use StrokeShape (previously CornerRadius) to define the corners. Eg. &amp;lt;nowiki&amp;gt;StrokeShape=&amp;quot;RoundRectangle 8,8,8,8&amp;quot;&amp;lt;/nowiki&amp;gt; where the corner curve can be written as 1 value (all the same), 2 values (horizontal and vertical), or 4 values (each corner defined seperately). The default StrokeShape is 'Rectangle', which effectively equals a CornerRadius of 0.&lt;br /&gt;
* StrokeThickness can be used to define the thickness of the border.&lt;br /&gt;
* Other properties documented in the link above can be used to define the look of the border. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfChart.XForms;assembly=Syncfusion.SfChart.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.Charts;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
'''There are some other properties that have changed their names on SfListView/SfListViewExt. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
SfListViewExt:&lt;br /&gt;
    * ItemHolding&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ItemLongPress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| * LeftSwipeTemplate, RightSwipeTemplate&lt;br /&gt;
| StartSwipeTemplate, EndSwipeTemplate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Layout name change ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;sync:SfListView.LayoutManager&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax has changed.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
! style=&amp;quot;width:7%&amp;quot; | Notes&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | It is recommended to use the inline syntax as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources, or other complex values in OnIdiom or OnPlatform values, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| When using GridLength as a type (e.g,. in ColumnDefinition.Width or RowDefinition.Height) in OnIdiom or OnPlatform, it should '''only''' be used with the inline syntax.&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
| In the scope of any OnPlatform/On Platform, WinPhone needs to be replaced with WinUI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Please refer to the wiki for more details and possibilities (e.g., if the value contains multiple elements): [https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom Platform and Device-specific UI with OnPlatform and OnIdiom].&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Chart control updates ===&lt;br /&gt;
'''The Title, Legend, and Zoom &amp;amp; Pan behavior syntax of the Chart control have changed. Further, some SyncFusion Chart components &amp;amp; Properties have changed.'''&lt;br /&gt;
&amp;lt;br&amp;gt;⚠️ For more information and examples about changed SyncFusion Chart components &amp;amp; Properties, please refer to the [https://help.syncfusion.com/maui/cartesian-charts/overview Syncfusion Maui Charts documentation]. For more info on how to customize a chart, refer to [[Charts#Mobile_Chart_Customizing|Mobile Chart Customizing]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Title&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartTitle Text=&amp;quot;{Binding Header}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Title&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.Legend&amp;gt;&lt;br /&gt;
&amp;lt;chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/chart:SfChart.ChartBehaviors&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalStripLine&lt;br /&gt;
    Width=&amp;quot;2&amp;quot;&lt;br /&gt;
    StrokeColor=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    IsPixelWidth=&amp;quot;True&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;5&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Color=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{Binding Header}&amp;quot; HorizontalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Title&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartLegend /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.Legend&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;chart:ChartZoomPanBehavior /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfChartExt.ZoomPanBehavior&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:NumericalPlotBand&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    Stroke=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    Start=&amp;quot;{Binding Value}&amp;quot;&lt;br /&gt;
    End=&amp;quot;{Binding Value}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;chart:FastLineSeries                    &lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Items}&amp;quot;&lt;br /&gt;
    Label=&amp;quot;{Binding Name}&amp;quot;&lt;br /&gt;
    Fill=&amp;quot;{Binding Color, Converter={StaticResource IntToColor}}&amp;quot;&lt;br /&gt;
    XBindingPath=&amp;quot;XValue&amp;quot;&lt;br /&gt;
    YBindingPath=&amp;quot;YValue&amp;quot;&lt;br /&gt;
    StrokeWidth=&amp;quot;2&amp;quot;&lt;br /&gt;
    EnableAntiAliasing=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SfPullToRefresh ==&lt;br /&gt;
&lt;br /&gt;
'''It is recommended to get rid of all SfPullToRefresh controls due to some issues that might occur.''' For more information refer to [[Mobile_XAML#Issues_with_SfPullToRefresh_in_MAUI|this article]]. In our Maui standard client, the PullToRefresh control has already been replaced by a Refresh button in the Context Menu, so there's no need for a custom Refresh button.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
     .../&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ '''If SfPullToRefresh is still required, the following points should be considered.'''&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:Mobile|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=28623</id>
		<title>HowTo:Convert Xamarin XAMLs to Maui</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Convert_Xamarin_XAMLs_to_Maui&amp;diff=28623"/>
				<updated>2025-09-11T12:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* TapGestureRecognizer and Swipe Conflict */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
=== Frame to Border ===  &lt;br /&gt;
'''Use Border instead of Frame.'''  &lt;br /&gt;
Frame is deprecated in MAUI. Use Border with `Stroke` instead of `BorderColor`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame ... /&amp;gt;&lt;br /&gt;
| &amp;lt;Border ... /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LayoutOptions with &amp;quot;...AndExpand&amp;quot; ===  &lt;br /&gt;
'''Replace &amp;quot;...AndExpand&amp;quot; with Grid layout.'''  &lt;br /&gt;
Horizontal/VerticalOptions ending in &amp;quot;...AndExpand&amp;quot; are deprecated. Use Grid with `ColumnDefinition Width=&amp;quot;*&amp;quot;` for expansion.&lt;br /&gt;
&lt;br /&gt;
=== GlyphLabel and Styles ===  &lt;br /&gt;
'''Use Label with new styles.'''  &lt;br /&gt;
Custom controls like `GlyphLabel` are no longer needed. Use `Label` with styles like `UBIKSymbolText`.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| controls:GlyphLabel&lt;br /&gt;
| Label with UBIKSymbolText style&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SfTabView Virtualization ===  &lt;br /&gt;
'''Enable virtualization.'''  &lt;br /&gt;
Add `EnableVirtualization=&amp;quot;True&amp;quot;` to all SfTabView instances or styles.&lt;br /&gt;
&lt;br /&gt;
=== Swipe Menu Icons on Android ===  &lt;br /&gt;
'''Refactor swipe templates and label styles.'''  &lt;br /&gt;
Icons in swipe menus were truncated on Android. Fixed via refactoring.&lt;br /&gt;
&lt;br /&gt;
=== Color Style Changes ===  &lt;br /&gt;
'''Dark theme adjustments.'''  &lt;br /&gt;
Changes to color styles may affect appearance. Review usage of `UBIKDarkThemeColor`, `UBIKDarkTextColor`, etc.&lt;br /&gt;
&lt;br /&gt;
=== Strikethrough Converter ===  &lt;br /&gt;
'''Use `TextDecorations=&amp;quot;Strikethrough&amp;quot;` instead of converter.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Text=&amp;quot;{Binding ..., Converter={StaticResource StrikethroughConverter}}&amp;quot;&lt;br /&gt;
| Text=&amp;quot;{Binding ...}&amp;quot; TextDecorations=&amp;quot;Strikethrough&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button Disabled Trigger ===  &lt;br /&gt;
'''Add trigger for disabled buttons.'''  &lt;br /&gt;
Maui buttons don’t visually change when disabled. Add trigger to style.&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer Replacement ===  &lt;br /&gt;
'''Use TappedBehavior instead.'''  &lt;br /&gt;
TapGestureRecognizer now intercepts taps. Use `TappedBehavior` to avoid conflicts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;... .GestureRecognizers&amp;gt;&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/... .GestureRecognizers&amp;gt;&lt;br /&gt;
| &amp;lt;... .Behaviors&amp;gt;&amp;lt;behaviors:TappedBehavior&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ...}&amp;quot; /&amp;gt;&amp;lt;/behaviors:TappedBehavior&amp;gt;&amp;lt;/... .Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TapGestureRecognizer and Swipe Conflict ===  &lt;br /&gt;
'''Remove TapGestureRecognizer from root Grid.'''  &lt;br /&gt;
TapGestureRecognizer blocks swipe behavior. Remove it and adapt parent list to trigger navigation. An example of such behaviors can be seen in UBIKChildArea.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:MAUI|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== Navigation in UBIKChildItem ===  &lt;br /&gt;
'''Use EventHandlerBehavior for navigation.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [none]&lt;br /&gt;
| &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Recommended ==&lt;br /&gt;
=== Extract DataTemplates from UBIKThemes ===&lt;br /&gt;
'''Create separate .xamlx files for the following DataTemplates.'''&lt;br /&gt;
It's not so easy about the namespaces:&lt;br /&gt;
* In our default templates, it's enough to add the following ones to every new separate .xamlx files at the beginning;&lt;br /&gt;
    * xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:platform=&amp;quot;clr-namespace:UBIK.MAUI.Platform.Renderers;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:resources=&amp;quot;clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
    * xmlns:uiservices=&amp;quot;clr-namespace:UBIK.UI.Services;assembly=UBIK.UI&amp;quot;.&lt;br /&gt;
* But we don't know if other namespaces might be used in the custom templates. So it might be necessary to really analyze the namespaces used and find/copy them from the UBIKThemes file.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;amp;nbsp; !! Templates !! &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| UBIKMainItem || UBIKChildItem || UBIKTaskItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskProperty || UBIKTaskPropertyString || UBIKTaskPropertyDouble&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyInt || UBIKTaskPropertyNumeric || UBIKTaskPropertyDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyGeoData || UBIKTaskPropertyBool || UBIKTaskPropertyPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKTaskPropertyList || UBIKTaskPropertyGuid || UBIKPropertyItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyTextLengthHint || UBIKPropertyDirectEditButtons || UBIKTaskPropertyEditButtons&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemString || UBIKPropertyDirectItemDouble || UBIKPropertyDirectItemInt&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemMinMax || UBIKPropertyDirectItemNumeric || UBIKPropertyDirectItemDateTime&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemGeoData || UBIKPropertyDirectItemBool || UBIKPropertyDirectItemPopup&lt;br /&gt;
|-&lt;br /&gt;
| UBIKPropertyDirectItemList || UBIKPropertyDirectItemGuid || UBIKDocumentItem&lt;br /&gt;
|-&lt;br /&gt;
| UBIKSearchResultItem || UBIKDefaultHotSpot || UBIKAngularLinkHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKRoundLinkHotSpot || UBIKInputHotSpot || UBIKSignatureHotSpot&lt;br /&gt;
|-&lt;br /&gt;
| UBIKObjectHotSpot || UBIKMediaHotSpot || &lt;br /&gt;
|}&lt;br /&gt;
=== VideoPlayer Adjustments ===&lt;br /&gt;
'''This property is repsonsible for the video player regarding how or if it should get scaled up depending on the value of the&lt;br /&gt;
Aspect property'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;VideoPlayer Aspect=&amp;quot;AspectFit&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The UriToVideoSourceConverter is no longer needed because the conversion of the &lt;br /&gt;
VideoSource gets done by the MediaElement itself. It is marked as obsolete and should therefore no longer be used.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI, Converter={StaticResource UriToVideoSource}}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... Source=&amp;quot;{Binding DocumentViewModel.LocalURI}&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''The StopTimer property is obsolete and no longer needed because the MediaElement behind does the Stop of the VideoPlayer&lt;br /&gt;
by itself.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... StopTimer=&amp;quot;{Binding Unloaded}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:VideoPlayer... /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== SearchBar Style Fix on iOS ===&lt;br /&gt;
'''On iOS, defining a transparent background for the SearchBar control results in a black text on black background appearance.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[issue on iOS only] UBIKThemes: SearchBar style: &amp;lt;Setter Property=&amp;quot;BackgroundColor&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;Delete this setter&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove TapGestureRecognizer from Main Item ===&lt;br /&gt;
'''Swiping on the Main items was broken by Maui (Documented in Information). The workaround is to remove the TapGestureRecognizer from UBIKMainItem, and add ListView-based navigation similar to that found in UBIKChildArea (with an extended binding path for technical reasons).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKMainItem)&lt;br /&gt;
&amp;lt;Grid.GestureRecognizers&amp;gt;&lt;br /&gt;
	&amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.GestureRecognizers&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Add Navigation Behavior in Child Area ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;(In UBIKChildArea)&lt;br /&gt;
[nothing]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
	&amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding AppStatus.RootList.Items[0].NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
== Highly Recommended ==&lt;br /&gt;
=== CircularImage to AvatarView ===  &lt;br /&gt;
'''Use AvatarView instead of CircularImage.'''  &lt;br /&gt;
CircularImage and its wrapping Frame are no longer needed. Use AvatarView from the MAUI Community Toolkit. Add the namespace:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:toolkit=&amp;quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&amp;lt;CircularImage Source=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;
| &amp;lt;toolkit:AvatarView ImageSource=&amp;quot;...&amp;quot; BorderWidth=&amp;quot;...&amp;quot; BackgroundColor=&amp;quot;...&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GlyphSize to FontSize and Alignment ===  &lt;br /&gt;
'''Use FontSize and alignment properties instead of GlyphSize.'''  &lt;br /&gt;
The GlyphSize property is obsolete. Use FontSize and add alignment properties for better layout.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;GlyphSize&amp;quot; Value=&amp;quot;13.0&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;Setter Property=&amp;quot;FontSize&amp;quot; Value=&amp;quot;16&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalOptions&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;VerticalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Setter Property=&amp;quot;HorizontalTextAlignment&amp;quot; Value=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StaticResource to DynamicResource ===  &lt;br /&gt;
'''Use DynamicResource and BaseResourceKey.'''  &lt;br /&gt;
For dynamic theming, use DynamicResource instead of StaticResource. When inheriting styles, use BaseResourceKey.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| BasedOn=&amp;quot;{StaticResource SomeStyle}&amp;quot;&amp;lt;br/&amp;gt;Style=&amp;quot;{StaticResource SomeStyle}&amp;quot;&lt;br /&gt;
| BaseResourceKey=&amp;quot;SomeStyle&amp;quot;&amp;lt;br/&amp;gt;Style=&amp;quot;{DynamicResource SomeStyle}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UBIKPropertyDirectEditListPopup and Guid link direct editing ===&lt;br /&gt;
We have changed the way the content item template is defined and used in UBIKPropertyDirectEditListPopup, which is used in the direct editing of Guid link properties. This change aims to simplify the template and is also due to the fact that the old approach has a poor performance in the new MAUI app.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate x:Key=&amp;quot;PopupFilterQueryItemTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
|| &lt;br /&gt;
The DataTemplate &amp;quot;PopupFilterQueryItemTemplate&amp;quot; is no longer needed and should be removed.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{StaticResource PopupFilterQueryItemTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
    x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    ItemTemplate=&amp;quot;{Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;ItemTapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot; Converter=&amp;quot;{StaticResource ItemTappedEventArgsToViewModelConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding ConfirmEditCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:SfListViewExt.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/controls:SfListViewExt&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
In comparison, the old solution defines a &amp;quot;PopupFilterQueryItemTemplate&amp;quot; DataTemplate which simply wraps the needed selection related behaviors to the existing &amp;quot;UBIKChildItem&amp;quot; template. The new solution reuses the &amp;quot;UBIKChildItem&amp;quot; template directly and add the same but adapted behaviors to the list view instead.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:MAUI|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
== Mandatory ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace conversion ===  &lt;br /&gt;
'''Update all namespaces to MAUI equivalents.'''  &lt;br /&gt;
All `xmlns` and `clr-namespace` declarations must be updated to their MAUI counterparts.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| xmlns=&amp;quot;http://xamarin.com/schemas/2014/forms&amp;quot;&lt;br /&gt;
| xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core&lt;br /&gt;
| clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;assembly=Microsoft.Maui.Controls&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Behaviors;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Classes;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Converters;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Converters;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Platform.Renderers;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Platform.Controls;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Services;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.CPL.Resources;assembly=UBIK.CPL&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Resources;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:UBIK.Scanning.Forms;assembly=UBIK.Scanning.Forms&lt;br /&gt;
| clr-namespace:UBIK.MAUI.Controls.ZXingScanner;assembly=UBIK.MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.PullToRefresh;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.Xforms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.ListView;assembly=Syncfusion.Maui.ListView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TreeView;assembly=Syncfusion.SfTreeView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.TreeView;assembly=Syncfusion.Maui.TreeView&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Core;assembly=Syncfusion.Maui.Core&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For classes referenced in the XAML code, please don't forget to also replace &amp;quot;CPL&amp;quot; with &amp;quot;MAUI&amp;quot; in the class namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
'''There are some other properties that have changed their names on SfListView/SfListViewExt. We don't use them in our standard XAMLs. But if you use them in customizings, please refer to https://help.syncfusion.com/maui/listview/migration for the complete list.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
SfListViewExt:&lt;br /&gt;
    * ItemHolding&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| ItemLongPress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Syncfusion control updates ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| * LeftSwipeTemplate, RightSwipeTemplate&lt;br /&gt;
| StartSwipeTemplate, EndSwipeTemplate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Layout name change ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;sync:SfListView.LayoutManager&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sync:SfListView.ItemsLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TemplateService binding for extracted templates ===&lt;br /&gt;
'''1. We need to add the following namespace where the changes are applied:&lt;br /&gt;
xmlns:services=&amp;quot;clr-namespace:UBIK.MAUI.Services;assembly=UBIK.MAUI&amp;quot;;&lt;br /&gt;
2. We need to search for both &amp;quot;StaticResource&amp;quot; and &amp;quot;DynamicResource&amp;quot;;&lt;br /&gt;
3. We only listed some examples here. But the same rule applies to all those templates exacted from UBIKThemes (see the first &amp;quot;Recommended&amp;quot; point).'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKChildItem}&lt;br /&gt;
| {Binding [UBIKChildItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKDocumentItem}&lt;br /&gt;
| {Binding [UBIKDocumentItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|-&lt;br /&gt;
| {StaticResource UBIKMainItem}&lt;br /&gt;
| {Binding [UBIKMainItem], Source={x:Static services:TemplateService.Instance}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OnPlatform and OnIdiom syntax changes ===&lt;br /&gt;
'''All code containing the OnPlatform and OnIdiom functionalities needs to be refactored as the syntax changed. It is recommended to use the inline syntax (see example) as a default wherever possible, but there are also other approaches.&lt;br /&gt;
When using Bindings, Resources or other complex values in OnIdiom or OnPlatform values, it should only be used with the inline syntax.&lt;br /&gt;
Please rely to the wiki for more details and possibilities (e.g. if the value contains multiple elements): https://wiki.augmensys.com/index.php?title=XAML_Tips#Platform_and_Device-specific_UI_with_OnPlatform_and_OnIdiom'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| OnPlatform&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnPlatform Android={Binding ...}, iOS={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| OnIdiom&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
        ...&lt;br /&gt;
        TheProperty=&amp;quot;{OnIdiom Phone=False, Desktop=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TheControl&lt;br /&gt;
     ...&lt;br /&gt;
     TheProperty=&amp;quot;{OnIdiom Desktop={Binding ...}, Phone={Binding ...}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
   &amp;lt;OnIdiom&lt;br /&gt;
        ...&lt;br /&gt;
        Desktop=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;RowDefinition.Height&amp;gt;&lt;br /&gt;
   &amp;lt;OnPlatform&lt;br /&gt;
        ...&lt;br /&gt;
        Android=&amp;quot;Auto&amp;quot;&lt;br /&gt;
        iOS=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RowDefinition.Height&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RowDefinition Height=&amp;quot;{OnPlatform Android='Auto', iOS='*'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove default ControlTemplate ===&lt;br /&gt;
'''The default ControlTemplate should be removed from the ContentView if the ControlTemplate property of that ContentView is determined by DataTriggers. The same applies to ContentControls. The default ContentTemplate should be removed from the controls:ContentControl if the ContentTemplate property of that ContentControl is determined by DataTriggers.'''&lt;br /&gt;
Using only DataTriggers without a default ControlTemplate ensures that content is created only after the trigger evaluation is complete. If a default ControlTemplate is set, it is always loaded immediately, even if another template is applied right after.&lt;br /&gt;
For more details refer to [[Xamarin_XAML#Conflicting_Triggers|Conflicting Triggers]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot; ControlTemplate=&amp;quot;{StaticResource YourTemplate}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView x:Name=&amp;quot;containerName&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger&lt;br /&gt;
            Binding=&amp;quot;{Binding Source={x:Reference containerName}, Path=...}&amp;quot;&lt;br /&gt;
            TargetType=&amp;quot;ContentView&amp;quot;&lt;br /&gt;
            Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot;&lt;br /&gt;
                    Value=&amp;quot;{StaticResource YourTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remove HeadlessLayout style ===&lt;br /&gt;
'''This Style has no longer any effect in MAUI and even degrades app performance. We are keeping it in our standard UBIKThemes under the Obsolete section to maintain backward compatibility.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style x:Key=&amp;quot;HeadlessLayout&amp;quot; TargetType=&amp;quot;Layout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;CompressedLayout.IsHeadless&amp;quot; Value=&amp;quot;{OnPlatform False, Android=True}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Delete it from your custom UBIKThemes file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Additional mandatory rule ===&lt;br /&gt;
'''In the customizings, however, it can and should be removed entirely, as it negatively affects performance, as mentioned before. To remove the style, you can simply use VS Code or any other editor with a search function and look through all custom .xaml files for usages of {StaticResource HeadlessLayout} or {DynamicResource HeadlessLayout}. These references should be removed from the respective elements or controls.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{DynamicResource HeadlessLayout}&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    Grid.Column=&amp;quot;2&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{DynamicResource ChildCountBadge}&amp;quot;&lt;br /&gt;
    HorizontalOptions=&amp;quot;Start&amp;quot;&lt;br /&gt;
    VerticalOptions=&amp;quot;Start&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Avoid multiple SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue that causes the app to freeze, avoid placing more than one SfPullToRefresh controls as siblings in a xaml hierarchy'''. If switching between contents in a SfPullToRefresh control is necessary use separate DataTemplates for the contents and use e.g. a DataTrigger to set one of them as the ControlTemplate of a ContentControl inside the SfPullToRefresh control.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh IsVisible = {Binding ShowContentB, Converter={StaticResource BoolToNotBool}}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh  IsVisible = {Binding ShowContentB}&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateA&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentA&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;TemplateB&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    x:Name=&amp;quot;ContentB&amp;quot;&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
   &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl&amp;gt;&lt;br /&gt;
               &amp;lt;controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateA}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
                   &amp;lt;DataTrigger&lt;br /&gt;
                       Binding=&amp;quot;{Binding ShowContentB}}&amp;quot;&lt;br /&gt;
                       TargetType=&amp;quot;controls:ContentControl&amp;quot;&lt;br /&gt;
                       Value=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
                       &amp;lt;Setter Property=&amp;quot;ContentTemplate&amp;quot; Value=&amp;quot;{DynamicResource TemplateB}&amp;quot; /&amp;gt;&lt;br /&gt;
                   &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
               &amp;lt;/controls:ContentControl.Triggers&amp;gt;&lt;br /&gt;
           &amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:MAUI|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== Avoid using SyncFusion ListViews directly in SfPullToRefresh controls ===&lt;br /&gt;
'''To prevent an issue on some Android devices that can cause some items in a SfListViewExt to be rendered incorrectly or not at all after triggering a PullToRefresh, avoid placing a SfListViewExt directly in a SfPullToRefresh control'''.&lt;br /&gt;
Instead, wrap the ListView in a DataTemplate and use it in a ContentControl as a child of the SfPullToRefresh control, as shown in the Xaml example below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
        &amp;lt;controls:SfListViewExt&lt;br /&gt;
            .../&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
&amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;DataTemplate x:Key=&amp;quot;ListViewTemplate&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;controls:SfListViewExt&lt;br /&gt;
                    .../&amp;gt;&lt;br /&gt;
            &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
       &amp;lt;pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
           &amp;lt;controls:ContentControl ContentTemplate=&amp;quot;{DynamicResource ListViewTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/pullToRefresh:SfPullToRefresh.PullableContent&amp;gt;&lt;br /&gt;
    &amp;lt;/pullToRefresh:SfPullToRefresh&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:MAUI|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
&lt;br /&gt;
=== Rename SfPullToRefresh properties ===&lt;br /&gt;
'''Renamed in Maui, however, currently these properties cause an issue and should not be included in customizings.'''&lt;br /&gt;
SfPullToRefresh:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| RefreshContentHeight, RefreshContentWidth&lt;br /&gt;
| RefreshViewHeight, RefreshViewWidth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename progress colors ===&lt;br /&gt;
'''Renamed in Maui.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| ProgressBackgroundColor, ProgressStrokeColor&lt;br /&gt;
| ProgressBackground, ProgressColor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rename Default Font Name  ===&lt;br /&gt;
'''The name of the default font was slightly renamed in the UBIKThemes file in MAUI — the first letter now needs to be capitalized. Otherwise, on iOS, bold or italic styles are not applied correctly, and changing a property in Direct Editing, for example, would result in no visible change.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
| &amp;lt;x:String x:Key=&amp;quot;TextFontFamily&amp;quot;&amp;gt;Inter&amp;lt;/x:String&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SfTabView ==&lt;br /&gt;
&lt;br /&gt;
=== Namespace Update ===&lt;br /&gt;
'''Update Syncfusion TabView namespace.'''&lt;br /&gt;
Replace the Xamarin namespace with the MAUI equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms&lt;br /&gt;
| clr-namespace:Syncfusion.Maui.Toolkit.TabView;assembly=Syncfusion.Maui.Toolkit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Remove Obsolete Converters ===&lt;br /&gt;
'''Remove ItemCountToBoolConverter from Resources.'''&lt;br /&gt;
This converter is no longer usable in TabView headers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:ItemCountToBoolConverter x:Key=&amp;quot;ItemCountToBool&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| [remove]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Add StringFormatConverter ===&lt;br /&gt;
'''Use StringFormatConverter for combined header strings.'''&lt;br /&gt;
Syncfusion MAUI TabView uses a single `Header` property instead of templates.&lt;br /&gt;
For all tab headers, formatters should be specified to assemble the text. As a best practice, even for simple header strings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [template-based header]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;converters:StringFormatConverter x:Key=&amp;quot;ChildrenTabFormatter&amp;quot; Parameter1=&amp;quot;{resources:Translate ChildrenTitle}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the above example, a previously defined formatter (that must be also added to the resource dictionary) is used to fill in the header attribute value.&lt;br /&gt;
⚠️ Avoid using bindings in `Parameter1` and `Parameter2` — use static strings only. For complex cases, use `EvalExpression`.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FontImageSource Styling ===&lt;br /&gt;
'''Add local style for FontImageSource.'''&lt;br /&gt;
Global styles are not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| [global FontImageSource style]&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Style TargetType=&amp;quot;FontImageSource&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;FontFamily&amp;quot; Value=&amp;quot;{DynamicResource UBIKSymbols}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Setter Property=&amp;quot;Color&amp;quot; Value=&amp;quot;{DynamicResource UBIKLightThemeColor}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TabView Structure ===&lt;br /&gt;
'''Use Grid to wrap TabView.'''&lt;br /&gt;
MAUI TabView requires a different structure and property set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
  &amp;lt;tabView:SfTabView&amp;gt;&lt;br /&gt;
    &amp;lt;tabView:SfTabItem Header=&amp;quot;string example header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
        &amp;lt;FontImageSource Glyph=&amp;quot;{x:Static resources:UBIKIcons.XXX}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.ImageSource&amp;gt;&lt;br /&gt;
      &amp;lt;tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
        &amp;lt;controls:UBIKContentView x:Name=&amp;quot;ChildContainer&amp;quot; Converter=&amp;quot;{StaticResource ChildAreaTemplateConverter}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/tabView:SfTabItem.Content&amp;gt;&lt;br /&gt;
    &amp;lt;/tabView:SfTabItem&amp;gt;&lt;br /&gt;
  &amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Property Changes ===&lt;br /&gt;
'''Update renamed or removed properties.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| VisibleHeaderCount&lt;br /&gt;
| [not available yet]&lt;br /&gt;
|-&lt;br /&gt;
| UBIKCenterButtonSettings&lt;br /&gt;
| CenterButtonSettings&lt;br /&gt;
|-&lt;br /&gt;
| SelectionIndicatorSettings&lt;br /&gt;
| IndicatorPlacement, IndicatorStrokeThickness, IndicatorBackground&lt;br /&gt;
|-&lt;br /&gt;
| SelectionColor&lt;br /&gt;
| Use VisualStateManager instead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Refer to [https://help.syncfusion.com/maui/tabview/migration Syncfusion migration guide] for full property list.&lt;br /&gt;
&lt;br /&gt;
== OnPlatform + OnIdiom backup ==&lt;br /&gt;
&lt;br /&gt;
=== Syntax Changes ===&lt;br /&gt;
'''Use inline or multi-tag syntax.'''&lt;br /&gt;
Single-tag syntax is outdated and may not build.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;OnPlatform Android=&amp;quot;False&amp;quot; iOS=&amp;quot;True&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;TheControl TheProperty=&amp;quot;{OnPlatform Android=False, iOS=True}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;TheType&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;On Platform=&amp;quot;iOS&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Required for multi-tag syntax&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WinPhone to WinUI ===&lt;br /&gt;
'''Replace WinPhone with WinUI.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| WinPhone&lt;br /&gt;
| WinUI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GridLength and TypeArguments ===&lt;br /&gt;
'''Avoid x:TypeArguments with GridLength.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ColumnDefinition.Width&amp;gt;&lt;br /&gt;
  &amp;lt;OnIdiom x:TypeArguments=&amp;quot;GridLength&amp;quot; Desktop=&amp;quot;Auto&amp;quot; Phone=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/ColumnDefinition.Width&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;ColumnDefinition Width=&amp;quot;{OnIdiom Desktop='Auto', Phone='*'}&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ Inline syntax is more reliable when using bindings or resources.&lt;br /&gt;
&lt;br /&gt;
=== Special Characters ===&lt;br /&gt;
'''Wrap values in quotes if they contain commas or strings.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| Margin={OnIdiom 10,2, Phone=2,0}&lt;br /&gt;
| Margin={OnIdiom '10,2', Phone='2,0'}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UWP to WinUI ===&lt;br /&gt;
'''Replace UWP with WinUI in all OnPlatform scopes.'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Xamarin&lt;br /&gt;
! MAUI&lt;br /&gt;
|-&lt;br /&gt;
| UWP&lt;br /&gt;
| WinUI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
⚠️ For more details, refer to the [https://wiki.augmensys.com/index.php?title=XAML_Tips#Device_and_Platform_Responsiveness Wiki documentation].&lt;br /&gt;
&lt;br /&gt;
[[Category:How-To|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:MAUI|Convert Xamarin XAMLs to Maui]]&lt;br /&gt;
[[Category:XAML|Convert Xamarin XAMLs to Maui]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28615</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28615"/>
				<updated>2025-09-05T07:48:34Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set a Binding as PropertyValue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin / Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin/Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28614</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28614"/>
				<updated>2025-09-05T07:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set a Binding as PropertyValue */ Added mobile syntax example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin / Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' in the above snippets with your required binding path, for example, ''AppStatus.CurrentUser.RawDetails[...]''. }}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin/Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28613</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28613"/>
				<updated>2025-09-05T07:45:55Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set Current DateTime */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin/Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28612</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28612"/>
				<updated>2025-09-05T07:45:11Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set Current DateTime */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin/Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28611</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28611"/>
				<updated>2025-09-05T07:40:31Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set a Binding as PropertyValue */ Added mobile syntax example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of an observable control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28609</id>
		<title>XAML Tips</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Tips&amp;diff=28609"/>
				<updated>2025-09-05T07:39:53Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Set a Binding as PropertyValue */ Added mobile syntax example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Attachable behaviors ==&lt;br /&gt;
It's quite often that you need to attach behaviors to certain XAML elements. For example, on a Grid, you want to attach a behavior which executes a command upon a Tapped event, or you want to execute a command when a certain property on a UBIK object changes.&lt;br /&gt;
&lt;br /&gt;
Notice that in the following examples, &amp;quot;Interactivity&amp;quot; and &amp;quot;Core&amp;quot; are both namespaces and you have to make sure that they are defined at the root of your XAMLs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    ...&lt;br /&gt;
    xmlns:Core=&amp;quot;using:Microsoft.Xaml.Interactions.Core&amp;quot;&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Triggered ===&lt;br /&gt;
With an EventTriggerBehavior, you can react on changes/events of UI Elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToChildrenCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Triggered ===&lt;br /&gt;
If you want to react on changes of the underlying data (ViewModel), you can use DataTriggerBehavior instead. The following example, when used in the ''UBIKSplashArea'' template, automatically navigates to the root objects once the login process is finished and the user was successfully authenticated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
   &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
       &amp;lt;Core:DataTriggerBehavior Binding=&amp;quot;{Binding IsLoggedIn}&amp;quot; Value=&amp;quot;True&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding NavigateToRootPageCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/Core:DataTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Content creation ==&lt;br /&gt;
=== Child item creation ===&lt;br /&gt;
{{Version/WinXSince|3.5.5}}&lt;br /&gt;
To directly create an object on a child of the current object, you can define a Button as follows. The method &amp;quot;Item.IsTypeCreationAllowed&amp;quot;  used in the expression gets the uid of the type that should be created below a child, if a child does not allow the creation of that type underneath it, the child will be hidden in the selection dialog. To actually create the object, the &amp;quot;CreateChildItemCommand&amp;quot; needs to be passed a KeyValueList with two parameters: The Parent-key is the UID or the ContentViewModel of the child underneath the object should be created, the Type-key is the type of object which should be created--this should match the uid passed to the &amp;quot;Item.IsTypeCreationAllowed&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;6D733909-1742-4110-8619-237849BFE453&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;PlantMap&amp;quot;&amp;gt;Item.IsTypeCreationAllowed(&amp;amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;cv:ListCollectionView x:Key=&amp;quot;PlantMapView&amp;quot; Expression=&amp;quot;{StaticResource PlantMap}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;AppBarButton.Flyout&amp;gt;&lt;br /&gt;
  &amp;lt;Flyout Placement=&amp;quot;Full&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ListView ItemsSource=&amp;quot;{Binding Source={StaticResource PlantMapView}}&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
		&amp;lt;Button Content=&amp;quot;{Binding Header}&amp;quot; Command=&amp;quot;{Binding CreateChildItemCommand}&amp;quot; x:Name=&amp;quot;CreateButton&amp;quot; Tag=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
			  &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Parent&amp;quot; Value=&amp;quot;{Binding Tag, ElementName=CreateButton}&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;21fc990a-d064-4bee-8d48-3293351f827a&amp;quot;/&amp;gt;&lt;br /&gt;
			  &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
			&amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
		  &amp;lt;/Button&amp;gt;&lt;br /&gt;
		&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
	  &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;
	&amp;lt;/ListView&amp;gt;&lt;br /&gt;
  &amp;lt;/Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton.Flyout&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Additionally, the following optional parameters can be added as well.&lt;br /&gt;
* CreateOnly (optional, defaults to false): When set to true, the client will not automatically navigate to the created content, rather automatically save and commit it. If set to true, this overrides the following parameters;&lt;br /&gt;
* AutoNavigate (optional, defaults to true): When set to false, the client will not automatically navigate to the created content;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and the database, and then committed to the server.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating multiple documents ===&lt;br /&gt;
To upload multiple documents at once, the CreateChildItemsCommand can be used. The list of supported command parameters are similar to those of the CreateChildItemCommand (single item). Except that anything other than AutoNavigate=false and AutoCommit=true do not make sense in multi-creation scenario. Therefore, those parameters are fixed and any received from XAML will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:classes=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding CreateChildItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Create multiple documents&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;Type&amp;quot; Value=&amp;quot;6170a068-2314-4444-ad62-0da99769a048&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disable FilloutCriteria  ===&lt;br /&gt;
{{Version/WinXSince|3.5}}&lt;br /&gt;
To enable/disable the automatic filtering of a query based on the ParentObject, there is the possibility to specify EnableFillOutCriteria--if it is not set, it defaults to false. Additionaly &amp;quot;SkipDialog&amp;quot; can be set to true, to not display a dialog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid x:Name=&amp;quot;selectionGrid&amp;quot; Tag=&amp;quot;{Binding MetaUID}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
         &amp;lt;Core:EventTriggerBehavior EventName=&amp;quot;Tapped&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Core:InvokeCommandAction Command=&amp;quot;{Binding ElementName=ChildAreaGrid, Path=DataContext.AddTemplatableDataCommand}&amp;quot; &amp;gt;&lt;br /&gt;
                    &amp;lt;Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
                        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;{Binding Tag,ElementName=selectionGrid}&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;EnableFillOutCriteria&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;uc:KeyValueParameter Key=&amp;quot;SkipDialog&amp;quot; Value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
                    &amp;lt;/Core:InvokeCommandAction.CommandParameter&amp;gt;&lt;br /&gt;
               &amp;lt;/Core:InvokeCommandAction&amp;gt;&lt;br /&gt;
         &amp;lt;/Core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
  &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hotspotting ==&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
The hotspotting command is used for hotspotting as well as for annotating, to configure the button for hotspotting, the commandparameter &amp;quot;Mode&amp;quot; should be set to &amp;quot;HotSpotting&amp;quot;, for annotating the &amp;quot;Mode&amp;quot; should be &amp;quot;Annotate&amp;quot;. The parameter commit is optional, if set to true, the changes get automatically persisted when leaving the editing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AppBarToggleButton&lt;br /&gt;
		IsChecked=&amp;quot;{Binding EditingAnnotation, Mode=TwoWay}&amp;quot;&lt;br /&gt;
		IsEnabled=&amp;quot;{Binding IsAnnotatable}&amp;quot;&lt;br /&gt;
		Command=&amp;quot;{Binding HotSpottingCommand}&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
			&amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Mode&amp;quot; Value=&amp;quot;Annotate&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;lt;uc:KeyValueParameter Key=&amp;quot;Commit&amp;quot; Value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
			&amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
		&amp;lt;/AppBarToggleButton.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/AppBarToggleButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remember scroll positions of list views ==&lt;br /&gt;
&lt;br /&gt;
=== Version 3.7 &amp;amp; later {{Version/WinXSince|3.7}} ===&lt;br /&gt;
Starting from this version,&lt;br /&gt;
* The precision of scroll position remembering is improved(by pixel offsets instead of by items);&lt;br /&gt;
* It also works for other scrollable lists (instead of just for content object lists).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To enable this feature, you should make sure the following.&lt;br /&gt;
* The SelectionBoundListView is used instead of the standard ListView. Its {{UBIK}} namespace is &amp;lt;code&amp;gt;UBIK.WinX.Controls&amp;lt;/code&amp;gt;;&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;RememberScrollPosition&amp;lt;/code&amp;gt; property is not set to &amp;quot;false&amp;quot;; (It's &amp;quot;true&amp;quot; by default.)&lt;br /&gt;
* The SelectionBoundListView's &amp;lt;code&amp;gt;x:Name&amp;lt;/code&amp;gt; property value is unique.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 3.6  {{Version/WinXSince|3.6}} ===&lt;br /&gt;
The UBIK-Client does include a function to remember the position in a list (ListView) when navigating away from it. This function is only available when the list (ListView) has a unique name as a property (x:Name). When browsing back to the previously visited list UBIK scrolls back to the last position. The function does not save scroll positions over different sessions.&lt;br /&gt;
Implementing the function to remember the scroll position in a ListView one has to consider that the list elements (Children) could depend on a other UI-element. If the list elements do depend on a other UI-elemente, this element has to be created above the ListView in the XAML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot; xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
     &amp;lt;uc:SelectionBoundListView x:Name=&amp;quot;ChildListView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
           &amp;lt;behaviors:FirstVisibleItemPersistenceBehavior FirstVisibleItems=&amp;quot;{Binding ScrollItems}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
     &amp;lt;/uc:SelectionBoundListView&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MultiBinding {{Version/WinXSince|3.6}} ==&lt;br /&gt;
Very often we want to display some UI elements (e.g. a Grid) depending on whether multiple criteria are met. It's much easier to achieve this by using a MultiBindingBehavior like the following.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&lt;br /&gt;
    xmlns:Interactivity=&amp;quot;using:Microsoft.Xaml.Interactivity&amp;quot;&lt;br /&gt;
    xmlns:behaviors=&amp;quot;using:UBIK.WinX.Behaviors&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:MultiBindingBehavior Converter=&amp;quot;{StaticResource VisLogicAndConverter}&amp;quot; PropertyName=&amp;quot;Visibility&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding MassEditViewModel, Converter={StaticResource NullToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;behaviors:MultiBindingItem Value=&amp;quot;{Binding Documents.Items.Count, Converter={StaticResource ItemCountToVisConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/behaviors:MultiBindingBehavior&amp;gt;&lt;br /&gt;
        &amp;lt;/Interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The behavior makes sure the container Grid is set to Visibile only if the mass editing mode is not turned on (MassEditViewModel is null) and the context object has child document(s) (Documents.Items.Count is greater than 0. You can combine any number of binding results (MultiBindingItem) using the VisLogicAndConverter (the name should be self explanatory).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Commands ==&lt;br /&gt;
=== InvokeOnItemsCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
Available on all ListViewModels, this command allows executing a specified command on a collection of list items. It can be used in combination with features such as [[Mass_Edit_(UBIK_WinX)|mass editing]] and [[XAML_Changes_in_UBIK_WinX_3.5#After_3.5|expression based collection filtering]]. Examples for both combinations are provided below.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The command specified through the &amp;quot;Command&amp;quot; parameter is executed on list items and, therefore, must be available in the list item contexts (view models). If in doubt, the [[Developer_Mode|developer mode]] can be used to inspect if a command is available in a certain context.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|Parameter &amp;quot;Command&amp;quot; and &amp;quot;SelectedItemsOnly&amp;quot; are specific to the InvokeOnItemsCommand. What other parameters to define or whether to define them at all depends on the type of command to be executed on the items.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on selected items ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
This example demonstrates how you can use the mass editing feature to select certain objects from the child list and then execute the SetPropertyValueCommand for those selected.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* You should insert the following code snippet into the default UBIKChildArea template;&lt;br /&gt;
* If the parameter &amp;quot;SelectedItemsOnly&amp;quot; is missed or set to &amp;quot;False&amp;quot;, the command will be executed on all child items;&lt;br /&gt;
* To enable selection, click on the &amp;quot;Mass Edit&amp;quot; button below the property list.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Children.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;SelectedItemsOnly&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
                    &amp;lt;x:Double&amp;gt;50&amp;lt;/x:Double&amp;gt;&lt;br /&gt;
                &amp;lt;/example:KeyValueParameter.Value&amp;gt;&lt;br /&gt;
            &amp;lt;/example:KeyValueParameter&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Invoke on filtered results ====&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
* First, you need to setup a filtered list&lt;br /&gt;
**UWP: Setup a ListCollectionView in the Resources section of a UI element (e.g. Grid). This list is only available/visible within that UI element (the Grid in this case).&lt;br /&gt;
**Xamarin: Setup a String with a filtering expression &amp;amp; a SfDataSourceExt in the ResourceDictionary of the ContentView. For the Expression property of the SfDataSourceExt refer to the created expression String.&lt;br /&gt;
&lt;br /&gt;
* The ItemsSource uses Children.Items. Use the [[Developer_Mode|developer mode]] if necessary to find out if this is available where you intend to define the list;&lt;br /&gt;
* The example expression filters for any items that don't contain the text &amp;quot;EXAMPLE&amp;quot; in their Title texts. You can filter differently by altering the expression.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid xmlns:CV=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
            &amp;lt;CV:ListCollectionView&lt;br /&gt;
                x:Key=&amp;quot;Filtered&amp;quot;&lt;br /&gt;
                Expression=&amp;quot;!Item.Title.Contains(&amp;amp;quot;EXAMPLE&amp;amp;quot;)&amp;quot;&lt;br /&gt;
                ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&lt;br /&gt;
    xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    ...&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
        &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
            &amp;lt;x:String x:Key=&amp;quot;Expresssion&amp;quot;&amp;gt;!Item.Title.Contains(&amp;amp;quot;EXAMLPLE&amp;amp;quot;)&amp;lt;/x:String&amp;gt;&lt;br /&gt;
            &amp;lt;controls:SfDataSourceExt x:Key=&amp;quot;Filtered&amp;quot; Expression=&amp;quot;{StaticResource Expresssion}&amp;quot; ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
With the filtered list configured, you can then insert the following code snippet to execute the SetPropertyValueCommand for the filtered result items.&lt;br /&gt;
* The example code assumes that the child objects have an editable property called &amp;quot;VALUE&amp;quot; and tries to set 50 as their value;&lt;br /&gt;
* The &amp;quot;Filtered&amp;quot; refers to the ListCollectionView (UWP) or SfDataSourceExt  (Xamarin) configured above.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;AppBarButton&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
      Icon=&amp;quot;AllApps&amp;quot;&lt;br /&gt;
      Label=&amp;quot;Set to 50&amp;quot;&lt;br /&gt;
      Style=&amp;quot;{ThemeResource UBIKActionAppBarButton}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/AppBarButton.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/AppBarButton&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    xmlns:example=&amp;quot;clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding Source={StaticResource Filtered}, Path=ListViewModel.InvokeOnItemsCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set to 50&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;Command&amp;quot; Value=&amp;quot;SetPropertyValueCommand&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;VALUE&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;example:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|The binding &amp;lt;code&amp;gt;ListViewModel.InvokeOnItemsCommand&amp;lt;/code&amp;gt; should be updated to &amp;lt;code&amp;gt;BulkOperation.InvokeOnItemsCommand&amp;lt;/code&amp;gt; starting from version 4.3.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support for old styled commands ====&lt;br /&gt;
Some old commands might not support KeyValueLists as parameters. In that case, just define the parameter value under the &amp;quot;CommandParameter&amp;quot; key, e.g.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;example:KeyValueParameter Key=&amp;quot;CommandParameter&amp;quot; Value=&amp;quot;some string value for example&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;.&lt;br /&gt;
This single value is then passed as the command parameter instead of the entire KeyValueList.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetPropertyValueCommand {{Version/WinXSince|3.6}} ===&lt;br /&gt;
{{Attention|To use a binding in the KeyValueParameter, it has to be applied like in the example provided here: [[KeyValueList]]}}&lt;br /&gt;
&lt;br /&gt;
This command existed before but was implemented differently. In the newer version(s), it is improved to provide customizers more control over the things that happen during/after the property value changes.&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* PropertyName: the name of the property to set a new value to;&lt;br /&gt;
* PropertyValue: the value to be set to the above mentioned property;&lt;br /&gt;
* OnlyForUnvalidated (optional, defaults to false): When set to true, the value will only be set if the property is not yet validated;&lt;br /&gt;
* AutoSave (optional, defaults to false): When set to true, the change(s) will be saved to the local cache and database;&lt;br /&gt;
* AutoCommit (optional, defaults to false): When set to true, the change(s) will be committed to the server.&lt;br /&gt;
&lt;br /&gt;
{{Hint|There's no way to commit changes without saving them locally first. Therefore, the &amp;quot;AutoSave&amp;quot; parameter will be ignored when &amp;quot;AutoCommit&amp;quot; is set to true.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an example of the command usage. It tries to set the property called &amp;quot;VALUE&amp;quot; to a double value 50 regardless of its current state and then automatically save and commit the change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;My Value&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For simple types, you can try writing them in the text format like &amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt; and {{UBIK}} will try to find the right type. For advanced property types, it is advised to provide typed values like &amp;lt;nowiki&amp;gt;&amp;lt;x:Boolean&amp;gt;true&amp;lt;/x:Boolean&amp;gt;&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set a Binding as PropertyValue ====&lt;br /&gt;
There is a known issue in XAML where Behaviors and KeyValueLists do not inherit the binding context of the control they are attached to. Simply put, trying to use a binding directly in the PropertyValue part of the command; '''&amp;lt;nowiki&amp;gt;&amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingPath}&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;''', would lead to the client setting the value of MP_PROPERTY to null.&lt;br /&gt;
&lt;br /&gt;
Luckily, there is a simple way to link this Binding to a context. Using the above example as a foundation, adapt the button as shown below:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.BindingPath, ElementName=SetDynamicPropertyButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin / Maui&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetDynamicPropertyButton&amp;quot;&lt;br /&gt;
    ... &amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.BindingPath, Source={x:Reference SetDynamicPropertyButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Replace ''BindingPath'' with your desired binding, such as ''AppStatus.CurrentLogin.RawDetails[...]'' etc.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code uses the x:Name of the button to specify the viewmodel from which we wish to begin our binding path.&amp;lt;br&amp;gt;&lt;br /&gt;
You do not need to follow this exact syntax, all that is necessary is to provide a connection to the BindingContext of any named control observable by this button.&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
==== Set Current DateTime ====&lt;br /&gt;
The current DateTime stamp can be retrieved from '''AppStatus.LiveDateTime'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Since the known issue described in the section above prevents direct binding to this, below are examples for how to implement it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Tag=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Style=&amp;quot;{StaticResource UBIKButtonStyle}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;controls:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;controls:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/controls:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hint|The DateTime can be set to the desired format by adding a StringFormatConverter to the LiveDateTime binding:&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;{Binding Tag.AppStatus.LiveDateTime, ElementName=SetCurrentDateTimeButton, &amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;Converter={StaticResource StringFormatConverter}, ConverterParameter={0:yyyy-MM-dd HH:mm}&amp;lt;/nowiki&amp;gt;'''&amp;lt;nowiki&amp;gt;}&amp;quot; &amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
    x:Name=&amp;quot;SetCurrentDateTimeButton&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding SetPropertyValueCommand}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;Set Property&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;classes:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyName&amp;quot; Value=&amp;quot;MP_PROPERTY&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;PropertyValue&amp;quot; Value=&amp;quot;{Binding BindingContext.AppStatus.LiveDateTime, Source={x:Reference SetCurrentDateTimeButton}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;OnlyForUnvalidated&amp;quot; Value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoSave&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classes:KeyValueParameter Key=&amp;quot;AutoCommit&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classes:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveAndCommitCommand ===&lt;br /&gt;
With the ''SaveAndCommitCommand'' it is possible to save and commit unsaved changes on a ContentViewModel.&lt;br /&gt;
&lt;br /&gt;
* ForceCommit CommandParameter (optional, defaults to false): Normally when the App is in Online mode, changes are automatically committed when saved. This is not the case when the App is in Manual mode. Setting the ''ForceCommit'' parameter to true makes it possible to commit the changes when saved in Manual mode.&lt;br /&gt;
* {{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} PropertyNameToSave CommandParameter (optional, defaults to null): Delivers the Property Name as String of a specific Property that should be saved. E.g. when called via PropertyViewModel.ResetCommand or PropertyViewModel.DeleteCommand, the ''PropertyNameToSave'' parameter is used to only apply the SaveAndCommitCommand on the related PropertyViewModel called from, and not on other unsaved changes on this ContentViewModel.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Button&lt;br /&gt;
      xmlns:example=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
      Command=&amp;quot;{Binding SaveAndCommitCommand}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
          &amp;lt;example:KeyValueList&amp;gt;&lt;br /&gt;
              &amp;lt;example:KeyValueParameter Key=&amp;quot;ForceCommit&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/example:KeyValueList&amp;gt;&lt;br /&gt;
      &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
  &amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DisplayViewCommand ===&lt;br /&gt;
This command can be used to [[Custom_View_(Client)|display cutom views]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TeachInCommand ===&lt;br /&gt;
With the '''TeachInCommand''' you're allowed to set your device's current location (&amp;quot;teach-in&amp;quot;, &amp;quot;TeachIn&amp;quot;) as the value of the context object's [[SYSCLS_GEO|geo property]].&lt;br /&gt;
This command is available in both '''ContentViewModel''' and '''PropertyViewModel'''.&lt;br /&gt;
* ContentViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the context object's [[SYSCLS_GEO|geo property]]. Saves and commits the change;&lt;br /&gt;
* PropertyViewModel.TeachInCommand: If possible, sets the current location of the device as the value of the current property if it's a geo property (not necessarily the [[SYSCLS_GEO|geo property]]). Addtionally supports a boolean command parameter:&lt;br /&gt;
** False (default): The change is not automatically saved. &lt;br /&gt;
** True: The change is saved.&lt;br /&gt;
&amp;lt;br/&amp;gt; {{hint| Make sure you use the correct binding path for your command depending on your current context view model. E.g., if the context view model is already the ContentViewModel then your binding path should simply be TeachInCommand. You can use the [[Developer_Mode|developer mode]] to find out the current view model in a view.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateArbitraryObjectCommand {{Version/WinXSince|4.7}}===&lt;br /&gt;
The &amp;quot;UpdateArbitraryObjectCommand&amp;quot; is responsible for updating an arbitrary object based on a set of provided parameters. The command is accessible in the AppStatusViewModel (as '''ViewModel.AppStatus'''). &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The available command parameters are:&lt;br /&gt;
* Uid (Mandatory): UID of the object to be updated;&lt;br /&gt;
* UpdateChildDepth (Optional): Child depth/level to update (defaults to 1);&lt;br /&gt;
* UpdateParentDepth (Optional): Parent depth/level to update (defaults to 0);&lt;br /&gt;
* UpdateIgnoreExpiry (Optional): Ignore update expiry (defaults to false); &lt;br /&gt;
&lt;br /&gt;
{{Hint|Note that if you set the UpdateChildDepth property to &amp;quot;-1&amp;quot; you are also able to update a whole branch with this command.}}&lt;br /&gt;
&lt;br /&gt;
Here is an example of the command usage: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button ...&lt;br /&gt;
    xmlns:uc=&amp;quot;using:clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
    Command=&amp;quot;{Binding UpdateArbitraryObjectCommand}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;Update Arbitrary Object&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Button.CommandParameter&amp;gt;&lt;br /&gt;
        &amp;lt;uc:KeyValueList&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;Uid&amp;quot; Value=&amp;quot;...valid UID...&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateChildDepth&amp;quot; Value=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateParentDepth&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;uc:KeyValueParameter Key=&amp;quot;UpdateIgnoreExpiry&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/uc:KeyValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/Button.CommandParameter&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access to an arbitrary object {{Version/WinXSince|4.6}} {{Version/XamarinSince|4.6}} ===&lt;br /&gt;
With the ObjectByUID feature it is possible to access any local arbitrary object by its UID and, for example, display a value of it.&lt;br /&gt;
It can be accessed from ContentViewModel, AuthenticationViewModel, and RootPageViewModel levels.&lt;br /&gt;
&lt;br /&gt;
To display a string of e.g. a property of an arbitrary object from ContentViewModel, AuthenticationViewModel &amp;amp; RootPageViewModel, the following syntax can be used in related XAMLs:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Property Dialogs the CallingViewModel prefix is needed to access an arbitrary object:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label Text=&amp;quot;{Binding CallingViewModel.ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].DisplayValue}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Localizing UI Texts ====&lt;br /&gt;
The most efficient practice is to use pre-localized texts from the standard client, however, this is not always possible, especially in custom UIs. The ObjectByUID indexer was therefore initially developed as a technique to allow localization of custom UI label texts. &lt;br /&gt;
&lt;br /&gt;
The concept is to create an infrastructure object that carries metaproperties for localized texts, then bind to this infrastructure object using ObjectByUID, and bind to a specific metaproperty to receive it's localized Description text as follows:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding ObjectByUID[paste-your-uid].Properties.VisibleItems[add-your-property-name].Description}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here there are two approaches; the database-leaning one is to add one metaproperty per UI label, and simply bind to the Description of it. However, this shifts maintenance effort to the UBIK Studio after the initial adding of the label in XAML. Another approach would be to use the metaproperty to provide a &amp;quot;tag&amp;quot; that the xaml customizer can then use to differentiate between hardcoded labels.&lt;br /&gt;
&lt;br /&gt;
A third approach would be to create one infrastructure object per label, however, this can lead to many objects being loaded upon startup.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Approach !! Implementation  !! Maintenance Effort !! Recommendation&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty per UI Label || Bind the label text to the metaproperty Description || Database / UBIK Studio || Recommended for UWP, customizings with fewer UI texts, finalized customizings.&lt;br /&gt;
|-&lt;br /&gt;
| One metaproperty delivering a  localization &amp;quot;tag&amp;quot; (such as: &amp;quot;EN&amp;quot; / &amp;quot;DE&amp;quot;) || Use something like DataTrigger (Xamarin) to hardcode a different localized text per tag (such as: &amp;quot;eg.&amp;quot; / &amp;quot;zb.&amp;quot;) || XAML || Recommended for Xamarin, highly customized UIs with many texts, customizings that tend to change often.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Showing Images and Icons ==&lt;br /&gt;
In UBIK, there are two types of image;&lt;br /&gt;
* The thumbnail image assigned to a UBIK object, delivered using the &amp;lt;nowiki&amp;gt;{Binding Icon...}&amp;lt;/nowiki&amp;gt; binding, in combination with a ByteToImageConverter. Examples can commonly be found on UBIKChildItem templates.&lt;br /&gt;
* Custom image shown with a specific purpose, such as a company logo or icon on a button/UI element.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Paths as string resources ====&lt;br /&gt;
When using custom images in your UI, it is a good idea not to hardcode path data into your Image control but instead to create a string resource in UBIKThemes that holds the image path, and use this string resource in your Image control. The benefit of the indirect connection between image file and usage is that the &amp;quot;file is in use&amp;quot; issue (sometimes experienced when either manual, or auto-deployment of xamls, tries to change image files when UBIK is running) is avoided this way.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;MainLogo&amp;quot;&amp;gt;ms-appdata:///local/xaml/Images/MainLogo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Image&lt;br /&gt;
    x:Name=&amp;quot;LogoImage&amp;quot;&lt;br /&gt;
    Height=&amp;quot;32&amp;quot;&lt;br /&gt;
    Stretch=&amp;quot;Uniform&amp;quot;&lt;br /&gt;
    Source=&amp;quot;{Binding Source={StaticResource MainLogo}, Converter={StaticResource PathToImageConverter}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;	&lt;br /&gt;
'''UBIKThemes:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Logo_Image&amp;quot;&amp;gt;IMG_Logo.png&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Usage:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:customimage=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;customimage:FileImage&lt;br /&gt;
    HeightRequest=&amp;quot;140&amp;quot;&lt;br /&gt;
    Aspect=&amp;quot;AspectFit&amp;quot;&lt;br /&gt;
    FileName=&amp;quot;{StaticResource BorealisLogo_Image}&amp;quot; &lt;br /&gt;
    FolderName=&amp;quot;xaml&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
UBIK comes equipped with a collection of icons that can be easily used in your customizing. [[Icon_Font|Here is an indepth explanation on usage]].&lt;br /&gt;
&lt;br /&gt;
In the case that you require an icon that is not included in our icon font file, there is the possibility to use SVG path data to render your required icon in the UI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Icons ====&lt;br /&gt;
Here referring to icons which are not included as standard icons un UBIK.&lt;br /&gt;
&lt;br /&gt;
'''Path data''' is a collection of points, which combined together form a vector image. Vector images, compared to raster images like a PNG or JPG, are scalable, because they are always rendered from path data, and not from a bitmap, which has to be stretched or squished to fit your defined size. Described below two approaches. &lt;br /&gt;
&lt;br /&gt;
===== Using (SVG) Files =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''UWP approach''' involves adding an SVG icon file to your xaml project and render it using an Image control. &lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;				&lt;br /&gt;
&amp;lt;Image Width=&amp;quot;14&amp;quot; Height=&amp;quot;14&amp;quot; Margin=&amp;quot;0,0,0,1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Image.Source &amp;gt;&lt;br /&gt;
        &amp;lt;SvgImageSource UriSource=&amp;quot;{StaticResource PP_Issued}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Image.Source&amp;gt;&lt;br /&gt;
&amp;lt;/Image&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Path Data =====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The '''Xamarin approach''' shows how to use svg data directly using a Path control.&lt;br /&gt;
&lt;br /&gt;
The first step is to generate path data for your icon. The easiest way is to download the [https://apps.microsoft.com/detail/9wzdncrdxf41?hl=en-US&amp;amp;gl=US| Character Map] tool from Microsoft. This can be used to browse all installed icon files for your icon of choice. Once selected, use Tools &amp;gt; Xaml / Xamarin Forms to show various useful aspects of the icon. With an icon selected, the Path Geometry section can be used to generate a path data that can be pasted directly in your xaml as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Path Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot; Data=&amp;quot;F1 M 8.75 1.25 L 18.75 1.25 L 18.75 18.75 L 1.25 18.75 L 1.25 8.75 L 5 8.75 L 5 6.25 L 1.25 6.25 L 1.25 1.25 L 6.25 1.25 L 6.25 5 L 8.75 5 Z M 10 2.5 L 10 5 L 12.5 5 L 12.5 2.5 Z M 2.5 5 L 5 5 L 5 2.5 L 2.5 2.5 Z M 6.25 6.25 L 6.25 8.75 L 8.75 8.75 L 8.75 6.25 Z M 2.5 10 L 2.5 12.5 L 5 12.5 L 5 10 Z M 17.5 17.5 L 17.5 2.5 L 13.75 2.5 L 13.75 6.25 L 10 6.25 L 10 10 L 6.25 10 L 6.25 13.75 L 2.5 13.75 L 2.5 17.5 Z &amp;quot; /&amp;gt;					&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your Path control, you can customize it as [https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/user-interface/shapes/path| documented by Microsoft]. Path data generated using the above method will most likely need a Fill attribute, for example &amp;lt;nowiki&amp;gt;Fill=&amp;quot;{StaticResource UBIKAccentColor}&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Hint|More complicated icons will have longer and more complicated paths.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;br /&gt;
&lt;br /&gt;
== TabView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the TabView control in your XAML code, UI virtualization can greatly improve initial loading performance, based on the scenario.Here's how to enable it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView EnableVirtualization=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Tab Selection ===&lt;br /&gt;
The tab selection in UBIKContentView defaults to the first tab, which is Children objects. However, for cases where it makes more sense to display Properties or Documents by default, it is possible to change the tab selection using the following classifications:&lt;br /&gt;
* [[SYSCLS_SHOWDOCUMENTS]]&lt;br /&gt;
* [[SYSCLS_SHOWPROPERTIES]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
Adding the classification to a metaclass is enough for UWP.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
Xamarin currently requires additional customizing to make use of the TabSelector property. One approach is to add a DataTrigger to the SfTabView found in UBIKContentArea that is triggered by the value of the TabSelector property, as shown below;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tabView:SfTabView VisibleHeaderCount=&amp;quot;3&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;!-- tabView:SfTabItems ... --&amp;gt;&lt;br /&gt;
     &amp;lt;tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;PropertiesTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
          &amp;lt;DataTrigger TargetType=&amp;quot;tabView:SfTabView&amp;quot; Binding=&amp;quot;{Binding TabSelector}&amp;quot; Value=&amp;quot;DocumentsTab&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Setter Property=&amp;quot;SelectedIndex&amp;quot; Value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
     &amp;lt;/tabView:SfTabView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/tabView:SfTabView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FlipView ==&lt;br /&gt;
&lt;br /&gt;
=== UI virtualization ===&lt;br /&gt;
When using the FlipView control in your XAML code, it's better to enable [https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui-virtualization UI virtualization]. The difference in performance gets more obvious as the number of items in the FlipView increases. Here's how to enable it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;FlipView&lt;br /&gt;
    ...&lt;br /&gt;
    VirtualizingStackPanel.VirtualizationMode=&amp;quot;Standard&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;
            &amp;lt;VirtualizingStackPanel Orientation=&amp;quot;Horizontal&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/Flipview.ItemsPanel&amp;gt;&lt;br /&gt;
&amp;lt;/FlipView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VirtualizingStackPanel.VirtualizationMode offers two possibilities: Standard &amp;amp; Recycling. In case you are interested, here are their [https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizationmode?view=netframework-4.7.2 differences].&lt;br /&gt;
&lt;br /&gt;
=== Auto saving {{Version/WinXSince|4.6}} ===&lt;br /&gt;
Unsaved changes on the document (e.g. Annotations) are gonna be saved and committed automatically when flipping the page in the FlipView.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Changes are lost when leaving the page without flipping the document first.}}&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|4.7}} {{Version/XamarinSince|4.7}} If you want to keep the changes when leaving the page by e.g. navigating away without flipping the document first, there is a boolean property called ''AutoSaveDocumentsOnPageClose'' (default value: false) which enables this behavior. It can be activated by adding the property to (or editing it in) the custom UBIKThemes as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;AutoSaveDocumentsOnPageClose&amp;quot;&amp;gt;true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platform and Device-specific UI with OnPlatform and OnIdiom ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although '''OnPlatform''' and '''OnIdiom''' are used in Xamarin, the following wiki article is valid from MAUI 5.0 (add version flag), as the syntax changed.&lt;br /&gt;
&lt;br /&gt;
'''OnPlatform''' can be used to define different property values based on the platform. Valid Platform names are:&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
* WinUI (for MAUI Windows)&lt;br /&gt;
* further ones see [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0#customize-ui-appearance-with-a-markup-extension-based-on-the-platform here]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''OnIdom''' can be used to define different property values based on the device type (e.g. Phone, Tablet, Desktop).&lt;br /&gt;
&lt;br /&gt;
When it comes to the proper syntax, we should stick with the approaches mentioned in the [https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/customize-ui-appearance?view=net-maui-9.0 official documentation].&lt;br /&gt;
Means, we should '''avoid''' using the single-tag syntax like ''&amp;lt;OnPlatform Android=&amp;quot;...&amp;quot; iOS=&amp;quot;...&amp;quot; /&amp;gt;'' or ''&amp;lt;OnIdiom Phone=&amp;quot;...&amp;quot; Desktop=&amp;quot;...&amp;quot; /&amp;gt;'' like it was usual in Xamarin.&lt;br /&gt;
&lt;br /&gt;
Instead, we should either use the '''multi-tag syntax''' or the '''inline syntax''' for OnPlatform / OnIdiom.&lt;br /&gt;
&lt;br /&gt;
==== Multi-tag syntax ====&lt;br /&gt;
Here it is mandatory to add '''x:TypeArguments=&amp;quot;TheType&amp;quot;''' with the proper type to OnPlatfrom/OnIdiom. ''Default=&amp;quot;...&amp;quot;'' is optional and can be added like in the following example if a default value needs to be defined.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnPlatform x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;iOS, WinUI&amp;quot; Value=&amp;quot;0,20,0,0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;On Platform=&amp;quot;Android&amp;quot; Value=&amp;quot;10,20,20,10&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;Thickness&amp;quot; Default=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Desktop&amp;gt;0,60,0,0&amp;lt;/OnIdiom.Desktop&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If OnPlatform Values contain multiple subtags, the following syntax can be used:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;ExampleControlTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;OnPlatform x:TypeArguments=&amp;quot;View&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;Android&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button A&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;iOS&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Button&lt;br /&gt;
                    ...&lt;br /&gt;
                    Text=&amp;quot;Button B&amp;quot; /&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
            &amp;lt;On Platform=&amp;quot;WinUI&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Grid&amp;gt;&lt;br /&gt;
                    &amp;lt;Button&lt;br /&gt;
                        ...&lt;br /&gt;
                        Text=&amp;quot;Button C&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;Label Text=&amp;quot;Example&amp;quot; /&amp;gt;&lt;br /&gt;
                    ...&lt;br /&gt;
                &amp;lt;/Grid&amp;gt;&lt;br /&gt;
            &amp;lt;/On&amp;gt;&lt;br /&gt;
        &amp;lt;/OnPlatform&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|When using ''GridLength'' as a type in OnPlatform/OnIdiom, it should only be used in combination with the inline syntax.}}&lt;br /&gt;
&lt;br /&gt;
==== Inline syntax ====&lt;br /&gt;
When using the inline syntax, the type should not be specified. ''Default='' is optional.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnPlatform&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnPlatform Default=Yellow, iOS=Red, Android=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;OnIdiom&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;BoxView Color=&amp;quot;{OnIdiom Default=Yellow, Phone=Red, Tablet=Green}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the value contains any special characters like &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; or a '''string''' when using the OnIdiom or OnPlatform inline variant, it needs to be wrapped between &amp;lt;code&amp;gt;' '&amp;lt;/code&amp;gt;. But be careful with using apostrophes - when using them around curly brackets {} it can lead to an error.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom 10,2, Phone=2,0}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Margin=&amp;quot;{OnIdiom '10,2', Phone='2,0'}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Complex values ===&lt;br /&gt;
If the OnPlatform/OnIdiom value contains a '''Binding''', '''StaticResource''' or any other complex value in curly brackets, it is recommended to use the '''inline syntax'''. Although it's not confirmed in any official documentation, it seems to work according to our experience. However, the multi-tag syntax doesn't always seem to work for such cases. DynamicResource values seem to be not supported at all in OnIdiom / OnPlatform.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Don't&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;OnIdiom x:TypeArguments=&amp;quot;...&amp;quot; Default=&amp;quot;{Binding ...}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;OnIdiom.Phone&amp;gt;{Binding ...}&amp;lt;/OnIdiom.Phone&amp;gt;&lt;br /&gt;
&amp;lt;/OnIdiom&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Instead do&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
Header=&amp;quot;{OnIdiom Default={Binding ...}, Phone={Binding ...}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Unreliable Support: Behavior may vary when using bindings or complex resources. Although it seems to work with the inline syntax according to our experiences, it is recommended to test these edge cases thoroughly.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|XAML Tips]]&lt;br /&gt;
[[Category:WinX|XAML Tips]]&lt;br /&gt;
[[Category:XAML|XAML Tips]]&lt;br /&gt;
[[Category:Xamarin|XAML Tips]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28603</id>
		<title>HowTo:Implement Custom Filtering</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28603"/>
				<updated>2025-08-28T12:00:35Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Filtering a DateTime Property */ added section on troubleshooting localization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to customize filtered lists that accept one or multiple user inputs as filter criteria (referred to as 'Dynamic'), alone or combined with predefined criteria(referred to as 'Static'). The following examples are based on the Children.Items collection, however, Properties or Documents can be filtered too, by adjusting the ItemsSource in the &amp;lt;cv:ListCollectionView&amp;gt; or &amp;lt;controls:SfDataSourceExt&amp;gt; in UWP or Xamarin respectively. &lt;br /&gt;
&lt;br /&gt;
{{Attention|Are you sure you need this?&amp;lt;br&amp;gt;UBIK has a simpler out-of-the-box Property-based filtering technique for filtering child objects when one or multiple property value inputs are the only type of criteria required. See [[Property_Based_Content_Filters]]}}&lt;br /&gt;
&lt;br /&gt;
Four elements are required for Custom Filtering:&lt;br /&gt;
* Input field - for user inputs.&lt;br /&gt;
* [[EvalExpression]] - for converting user inputs into a filter expression.&lt;br /&gt;
* Collection Filter - for applying the expression to a collection.&lt;br /&gt;
* Items control - for displaying the filtered items.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This system acts dynamically to output the filtered list, without requiring the use of an Evaluation button, and directly outputs all items that match the filter input.&lt;br /&gt;
&lt;br /&gt;
This page will first describe the basic implementation of a single dynamic input, then describe how to allow for multiple inputs, and finally, how to combine multiple dynamic inputs with static, predefined criteria.&lt;br /&gt;
However, keep in mind that for simply dynamically filtering child objects based on single or multiple property values, this complex customizing is not required. Instead, this technique gives the possibility to create multiple collections based on the same child collection, each with individual filters that do not interfere with each other, or else to create filters based on dynamic inputs for Properties or Documents, which are not handled by the Content-Based Filtering functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Basic Implementation ==&lt;br /&gt;
To build the filter in XAML, you will need to place an EvalExpression and a Collection Filter in the Resources of your container (most likely, a Grid). In the container's content, you will need the Input control, and the items control as an output (most likely a ListView).&lt;br /&gt;
&lt;br /&gt;
The following namespaces are used:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
For UWP, it is possible to place the EvalExpression and Collection Filter into the &amp;lt;Grid.Resources&amp;gt;, as shown below. However, for Xamarin, it is required to use the &amp;lt;ContentView.Resources&amp;gt;.&lt;br /&gt;
For the Collection Filter, use [[XAML_Changes_in_UBIK_WinX_3.5#Filtering_by_expressions|ListCollectionView]] for UWP &amp;amp; [[Xamarin_XAML#FeatureRelated|Content_filtering]] for Xamarin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
	&amp;lt;cv:ListCollectionView&lt;br /&gt;
		x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
		Expression=&amp;quot;{Binding ElementName=FilterExpression, Path=Result}&amp;quot;&lt;br /&gt;
		ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note that the EvalExpression in UWP requires an x:Name, which in turn requires the 'ElementName' syntax seen in the &amp;lt;cv:ListCollectionView&amp;gt;.}}&lt;br /&gt;
{{Attention|Note that the Converter seen in the 'EXP' EvalExpressionParameter in UWP is 'StringFormatConverter', which is different than in Xamarin.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
		&amp;lt;controls:SfDataSourceExt &lt;br /&gt;
			x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
			Expression=&amp;quot;{Binding Source={StaticResource FilterExpression}, Path=Result}&amp;quot;&lt;br /&gt;
			ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; &lt;br /&gt;
                         Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|Note that Unloaded attribute improves performance by preventing refiltering while navigating away from the page. This attribute should be added to all instances of controls:SfDataSourceExt in your customizing.}}&lt;br /&gt;
{{Hint|Note that the EvalExpression in Xamarin requires an x:Key, which in turn requires the 'StaticResource ' syntax seen in the &amp;lt;controls:SfDataSourceExt&amp;gt;.}}&lt;br /&gt;
{{Hint|Note that the Converter seen in the 'EXP' EvalExpressionParameter in Xamarin is 'StringFormat', which is different than in UWP.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The EvalExpression Expression first checks whether the TextBox input is empty (as this would otherwise incorrectly be considered a filter input, whereby the property should be empty) and if so returns the unfiltered list (expression outcome hardcoded to 'true'), otherwise, applies the filter (expression outcome is taken from string constructed in ConverterParameter of 'EXP').&lt;br /&gt;
&lt;br /&gt;
There are two important details of the EvalExpressionParameter to note here: &lt;br /&gt;
* The &amp;quot;ElementName=NameInput&amp;quot; / &amp;quot;x:Reference NameInput&amp;quot; should match exactly to the name of your Input control.&lt;br /&gt;
* The Item.Values[&amp;amp;quot;NAME&amp;amp;quot;] should be adapted, by changing NAME to the property that should be filtered by this input.&lt;br /&gt;
&lt;br /&gt;
=== TextBox / Entry ===&lt;br /&gt;
The input field is just a basic &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt; we will use to input the filter criteria value. The only important detail for this input control is the name, which must be passed back to the EvalExpressionParameter.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It will look like this:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Items control  ===&lt;br /&gt;
An items control will likely be used for displaying filtered results, such as &amp;lt;controls:SelectionBoundListView&amp;gt; for UWP &amp;amp; [[Xamarin_XAML#Performance|SfListViewExt]] for Xamarin:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SelectionBoundListView&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryList&amp;quot;     &lt;br /&gt;
       ItemsSource=&amp;quot;{StaticResource FilterView}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
       ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilterView}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multiple Dynamic (User Inputs) Criteria ==&lt;br /&gt;
It is likely that the customizing is required to process multiple user inputs for the same filter. In this case, the EvalExpression must be adapted to combine the inputs (most likely using an AND relation, for a 'filtering-down' effect), as well as to deliver the full list when nothing is inputted.&lt;br /&gt;
A &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt;, and an EvalExpression, will be required for every additional property, as well as a final EvalExpression to combine them.&lt;br /&gt;
&lt;br /&gt;
The EvalExpressions should be amended as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows how to check for inputs to either property, NAME and DESCR, then use an additional EvalExpression to create the expression string that combines them. For each additional property you need to:&lt;br /&gt;
* Create an EvalExpression that checks whether the text input is null or empty, and if not, returns the desired expression EXP.&lt;br /&gt;
*  Add each EvalExpression (Name_FilterExpression, Desc_FilterExpression) to the 'main' one (FilterExpression) as Parameters, combined using the escaped '&amp;amp;&amp;amp;' concatenation symbols.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to the escaped syntax required in the Expression, &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;+&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+&amp;lt;/source&amp;gt; is the correct syntax required to concatenate filter expressions together.}}&lt;br /&gt;
&lt;br /&gt;
Once the additional input controls have been created, processed in their own EvalExpressions, referenced as EvalExpressionParameters and the &amp;quot;FilterExpression&amp;quot; EvalExpression has been adapted as shown, the filter should already function as required; the Collection Filters and Items Controls do not need to be adapted.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Input To Filter Multiple Properties ===&lt;br /&gt;
Since we have control over how the input is matched against the properties, is possible to use the same input to filter against multiple properties, for example, both Title and SubTitle. This keeps the UI lean with less elements to clutter the layout, and the user is not forced to think about which input relates to which field. The downside, of course, is that the search will be slightly less refined.&lt;br /&gt;
This is achieved easily as shown:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT &amp;quot; Value=&amp;quot;{Binding ElementName=Title_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding ElementName=SubTitle_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Title_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding Source={StaticResource SubTitle_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note the different operator required in this case. Unless your object has the same Title ''and'' SubTitle, there will be no match found unless the FilterExpression is amended to an Or relationship.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Combining Dynamic (User Inputs) and Static (Predefined) Criteria ==&lt;br /&gt;
A common use of the Collection Filter is to filter child lists based on one or multiple properties, such as MetaDefinition.UID or a certain status, to present groups of specific object types. Therefore, it is likely that a customizing may require hardcoded filter criteria, combined with user input, if any is provided.&lt;br /&gt;
&lt;br /&gt;
The following describes how to implement such a scenario in XAML, again using [[:Category:Multiple Dynamic (User Inputs) Criteria]] as a starting point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once one or multiple EvalExpressions have been added to process each input (such as Name_FilterExpression, Desc_FilterExpression), the remaining predefined filter criteria, in this example, filtering for a specific MetaClass by UID, can be added as an x:String, or directly in the EvalExpression paramerter, though the first approach is recommended, for better readability.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The above syntax only works for individual static string filters. If you need to chain multiple hardcoded filters, such as filtering in several UIDs, they need one String resource each, and must be added to the FilterExpression expression individually as in the below example.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple Static Criteria ===&lt;br /&gt;
Experimentation has shown that the dynamic filter struggles to combine a single string made of multiple expressions, with additional expressions via the FilterExpression. However, it is still possible to combine user inputs and multiple static criteria, simply by breaking up the static criteria into separate strings. &lt;br /&gt;
&lt;br /&gt;
Of course, when for example filtering various MetaDefinitions.UIDs, the '&amp;amp;amp;' (and) comparison condition is no longer appropriate, as there will never be matches for multiple of these UIDs that returns a true result. In these cases, the comparison condition needs to be set to '||' ([[HowTo:Implement_Custom_Filtering#.27Or.27_Operations|Or]]).&lt;br /&gt;
The below example shows the correct syntax.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
{{Hint|Note that the above strings make use of the .Equals() method, which is an alternate option to the more commonly seen &amp;lt;nowiki&amp;gt;'Item.Content.MetaDefinition.UID.ToString().ToLower()==...&amp;lt;/nowiki&amp;gt;'}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Property Types ==&lt;br /&gt;
&lt;br /&gt;
=== Filtering an INT / Double ===&lt;br /&gt;
Though the string comparison works mostly the same for a Int / Dbl, you additionally have to include a .ToString() method to the EXP EvalExpressionParameter of that property's individual EvalExpression for it to evaluate:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
ConverterParameter='Item.Values[&amp;amp;quot;INSTRUCTIONID&amp;amp;quot;].ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a Boolean (CheckBox) ===&lt;br /&gt;
To process a Boolean filter, the expression needs to be slightly amended, due to the different type of filter match criteria that is required.&lt;br /&gt;
&lt;br /&gt;
Note that the below implementation returns all items by default (ie. when the CheckBox is unchecked), and returns only True matches when the CheckBox is checked. This functionality is designed to align with string input, where no filtering occurs for each string until something is entered into the corresponding text input box.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Note that this example uses UWP xaml syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Bool_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==false) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;MP_BOOL&amp;amp;quot;]==&amp;amp;quot;{0}&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The individual EvalExpression for a Boolean filter match needs to be amended as follows:&lt;br /&gt;
** The INPUT can never be null, as the IsChecked property is either True or False. Therefore we can remove the Null or empty test, and instead, check whether the CheckBox is checked or not. IsChecked=False should 'escape' the expression, and return all items (or, not contribute to the overall filtering).&lt;br /&gt;
* The EvalExpressionParameter 'EXP' similarly can be simplified, as it does not need to make a string match with .Contains, but simply check whether the property value matches to True or False.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Changes only need to be made to the individual EvalExpression. The &amp;quot;FilterExpression&amp;quot; that joins all individual expressions does not need to be amended, other than the regular additional EvalExpressionParameter, and updating the expression accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a GUID Property ===&lt;br /&gt;
The expression string seen in the &amp;quot;EXP&amp;quot; command parameters shown above compare a user input with the value stored in Values[MP_PROPERTY], of the requested property. However, in certain cases, it may not be adequate to search in Values[MP_PROPERTY], such as when the property is a GUID. This is because Values[LK_GUID_PROPERTY] returns the UID value of the linked object, whereas Properties.VisibleItems[LK_GUID_PROPERTY].DisplayValue returns the human readable label associated with this linked object. &lt;br /&gt;
&lt;br /&gt;
The solution is to rewrite the expression string to target the correct binding:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good way to inspect and test the target binding is to output it on the items UI, therefore on the ItemTemplate of your ListView, as well as to output the expressions that are being dynamically generated in your EvalExpressions, by binding the Result to the Text property of a &amp;lt;TextBlock&amp;gt; (UWP) or &amp;lt;Label&amp;gt; (Xamarin).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Filtering a DateTime Property ===&lt;br /&gt;
Filtering a DateTime property is more complex than other properties, because one has to consider both the input, and the type of filtering. &lt;br /&gt;
&lt;br /&gt;
Input can be done both as freetext, and using a DatePicker. Freetext input has the downside that users have to take care to enter the correct string format (ie. yyyy/MM/dd), whereas the DatePicker outputs a DateTime string which can then be formatted for use in the EvalExpression. The DatePicker does however have certain downsides, chief of which being that it is not nullable, the current date is shown when no date has been selected, making the non-filtered UI indistinguishable from the filtered one.&lt;br /&gt;
&lt;br /&gt;
Filtering can be done as a simple comparison, such as finding an object whose date matches the inputted date. However, it is also possible to ranges; either 'open', that is, dates before or after the user's selection, or 'closed', which is a date falling inside a range created by two user inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Input ====&lt;br /&gt;
The input method is the first important consideration for filtering DateTime properties. A DatePicker is the generally accepted method. Textbox input is also possible, though users will need to correctly format their input to 'yyyy/MM/dd' (such as &amp;quot;2032/12/31&amp;quot;) in order to achieve a valid comparison.&lt;br /&gt;
&lt;br /&gt;
'''DatePicker'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DatePicker&amp;quot; Tag=&amp;quot;{Binding SelectedDate, ElementName=DatePicker, Converter={StaticResource StringFormatConverter}, ConverterParameter='{0:yyyy/MM/dd}'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DateInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;Label x:Name=&amp;quot;DateString&amp;quot; Text=&amp;quot;{Binding Path=Date, Source={x:Reference DateInput}, StringFormat='{0:yyyy/MM/dd}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|In both cases, it is necessary that the format of the input matches the format of the property value, which will be explained more in the Comparison section below. In the above examples, this is applied in the Tag property (UWP) or through use of a secondary control (a Label in the Xamarin example).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Freetext'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;DateInput&amp;quot; PlaceholderText=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;DateInput&amp;quot; Placeholder=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Remember that no matches will be found unless the date is inputted following a 'yyyy/MM/dd' format.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For greater control over the input format, it is also possible to provide multiple TextBoxes, which could then either be concatenated in an EvalExpression, or used to filter by the DateTime.Day/Week/Month values of the property individually, if such functionality fits the usecase.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comparison ====&lt;br /&gt;
Since the EvalExpression approach utilizes string comparisons, not only is it necessary to format the input string, but the property value must also be formatted to match. The 'yyyy/MM/dd' format includes several measures to create the best conditions for comparing the two strings; &lt;br /&gt;
* months and days below the value of 10 cannot be a single digit, but must be padded with a preceding 0 in order to keep the string lengths equivalent; 2032/1/1 cannot be property compared with 2032/12/31 for example, as the strings are different lengths.&lt;br /&gt;
* putting the year and month first also improves the chance of a correct comparison, as a day 01 can be after a day 31 if the month and year are greater.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|For the rest of this section, a DatePicker input is assumed.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Single'''&lt;br /&gt;
&lt;br /&gt;
Comparison of a single date against a property value works the same way as other dynamic filters. Therefore it is sufficient to make use of the previously used .Contains() or .Equals() methods. &lt;br /&gt;
Remember that the Date attribute is not directly usable from the DatePicker, and its formatted version received via the Tag attribute or an additional label is what is actually used by the EvalExpressions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Range'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It is also possible to filter not for a specific date, but rather for all items whose property falls after or before the user input (depending on whether a  'Starting From' or 'Ending By' comparison is implemented. An 'open' range filter is created when only one value is inputted by the user, whereas a 'closed' range has a start and end date, and must fall on or in between these two.&lt;br /&gt;
&lt;br /&gt;
For range comparison, we use the  [https://learn.microsoft.com/en-us/dotnet/api/system.string.compareto?view=net-9.0 Microsoft .CompareTo method]. As documented there, this method outputs a -1/0/1 depending on the compared string's location in the range. Our expression can target one output for an 'exclusive' filter (in which the inputted date is not considered for the range), however, a more likely scenario is that the user wants the inputted date included in the filter. This is why the expression in the StringFormatConverter should be defined for start date as !=-1, and for end date as !=1; the instance should be not less than than the start date (where true would be an output of 0 or 1), and not greater than the end date (true = -1 or 0), respectively.&lt;br /&gt;
&lt;br /&gt;
Similar to the earlier section on [[HowTo:Implement_Custom_Filtering#Multiple_Dynamic_.28User_Inputs.29_Criteria|multiple inputs]], separate EvalExpressions are used for each half of the range, meaning that the filtering also works (as an 'open Range' filter) when only one value is inputted by the user. To implement only an open range filter, simply eliminate the second input and EvalExpression.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Start_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;End_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding ElementName=Start_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding ElementName=End_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Start_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;End_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Start_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding Source={StaticResource End_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note the .CompareTo method used in each half of the ranged filter expression; the start date comparison is &amp;lt;noWiki&amp;gt;!=-1&amp;lt;/noWiki&amp;gt;, whereas the end date comparison &amp;lt;noWiki&amp;gt;!=1&amp;lt;/noWiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Individual DateTime Components ====&lt;br /&gt;
The DateTime property has the additional benefit of exposing components that can be used to refine filtering.&lt;br /&gt;
&lt;br /&gt;
[[Developer_Mode]] reveals the members available under the binding path; &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;PropertyItems[&amp;quot;DATETIME&amp;quot;].Value&amp;lt;/source&amp;gt;&lt;br /&gt;
These include; Date, Day, DayOfWeek, DayOfYear, Hour, Millisecond, Minute, Month, Ticks, TimeOfDay, and Year.&lt;br /&gt;
&lt;br /&gt;
These can be used in the EvalExpressionParameter as a binding in the custom expression string, as follows, and can even be used in separate filters to search individual components of the date seperately (for example, to filter by a particular month, year, or even day of the week).&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DateInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DayWeekInputString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Troubleshooting ====&lt;br /&gt;
If no match is found when one is expected, it's possible that localization is affecting the ToString evaluation of the object's DateTime property. The StringFormatConverter used in the Start/End_FilterExpression hardcodes a search string (in this case yyyy/MM/dd with '/' as seperators). To check that that the matched strings coming from the datepickers and property values are exactly the same, output both to the UI and ensure that everything about them is the same, including order of year-month-day elements, dividing symbols, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Adjustments ==&lt;br /&gt;
=== 'Or' Operations ===&lt;br /&gt;
All examples of multiple inputs in this article use an 'and' filter condition, where, if any inputs are entered, only items that match all inputs (NAME &amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt; DESC) are kept in the collection, to produce a 'filtering down' effect in the user interface.&lt;br /&gt;
&lt;br /&gt;
If a less strict filter condition is required, the FilterExpression can be altered to have an 'or' condition, where all results that match NAME &amp;lt;b&amp;gt;or&amp;lt;/b&amp;gt; DESC, but not necessarily both, are shown. To do so, simply change the concatenation syntax to return 'or' symbols (two pipes or '||'):&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;amp;quot;||&amp;amp;quot;+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Displaying a Count ==&lt;br /&gt;
To display the filtered count, use the following syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding Path=Count, Source={StaticResource FilterView}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persisting Filter Values ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
One of the drawbacks of this method of filtering is the inability for the UI to 'remember' user inputs when they navigate away from the page. This is because this implementation of dynamic filters exists solely on the UI thread (that is, is defined in XAML only with no actual connection to the data, opposite to [[Property_Based_Content_Filters]], for example), which is re-rendered according to the xaml definition every time the page is loaded. This section describes how to implement a limited solution to this issue, the limitation being that values can currently only be persisted during the 'session', and are lost when the user closes the client.&lt;br /&gt;
&lt;br /&gt;
This solution involves use of the StoreProfileParameterCommand to create key-value pairs (a simple list of items made up of a name and a value), which can then be read using the 'StoredProfileParameters[key]'. The StoreProfileParameterCommand accepts a CommandParameter with the format 'key=value', where 'key' represents the name of the key-value pair that can be used to reference it later (in the case below, &amp;quot;name&amp;quot;), and 'value' represents what string should be returned by referencing it (in this case, the Text attribute of the text field control).&lt;br /&gt;
&lt;br /&gt;
When a user completes their input, we use the StoreProfileParameterCommand to create or update a key-value pair associated with a particular filter, instead of passively reading the value from the input as was done previously. &lt;br /&gt;
&lt;br /&gt;
Furthermore, the associated StoredProfileParameter is fed back to the input control so that if any value is set for that particular key (ie. if a filter value has been created), it will be displayed on the input control. Otherwise, the input control will be reset when next loading the page, as was previously the case with dynamic filtering, whereas the StoredProfileParameter will be persisted, leading to a mismatch between the UI and filtering state.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:EventTriggerBehavior EventName=&amp;quot;LostFocus&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;core:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Text, ElementName=NameInput, Converter={StaticResource StringFormatConverter}, ConverterParameter='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/TextBox&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pay attention to which [https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.textbox?view=winrt-26100#events Event] is used to trigger the StoreProfileParameterCommand. The above example uses LostFocus, which fires when the user clicks out of the TextBox. Another possible choice is TextChanged, however, this means that the command will fire with every keystroke, which may reduce overall performance.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Entry.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Completed&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference NameInput}, StringFormat='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry.Behaviors&amp;gt;				&lt;br /&gt;
&amp;lt;/Entry&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Xamarin 'Completed' event fires when the user clicks the return button on their onscreen keyboard.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
{{Hint|StringFormatConverter/StringFormat is used to format the key-value pair as required by the StoreProfileParameterCommand. The key is hardcoded into the formatted string as, for example &amp;lt;noWiki&amp;gt;'name={0}'&amp;lt;/noWiki&amp;gt;. The dynamic value, in this case whatever is inputted in the text field when the edit is completed, replaces the &amp;lt;noWiki&amp;gt;{0}&amp;lt;/noWiki&amp;gt; tag when the binding is evaluated (ie. when the command is executed).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this implementation, the EvalExpression also needs to be adapted to check whether a particular filter value exists within the StoredProfileParameters list, instead of simply whether the associated input control has a value or selection:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note how the EvalExpressionParameters have been adapted to reference a StoredProfileParameter, rather than the input control.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Item Selection ===&lt;br /&gt;
Filter value persistence works also when the user input method is to select an item from a picker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:PickerExt&lt;br /&gt;
    x:Name=&amp;quot;ExamplePicker&amp;quot;&lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Children.Items[0].PropertyItems[PROPERTY].MetaProperty.SelectiveList, Converter={StaticResource SelectiveListToItems}, TargetNullValue='', FallbackValue=''}&amp;quot;&lt;br /&gt;
    ItemDisplayBinding=&amp;quot;{Binding DisplayText}&amp;quot;&lt;br /&gt;
    SelectedValuePath=&amp;quot;Value&amp;quot;&lt;br /&gt;
    SelectedValue=&amp;quot;{Binding StoredProfileParameters[key]}&amp;quot;&lt;br /&gt;
    SelectionChangedCommand=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot;&lt;br /&gt;
    SelectionChangedCommandParameter=&amp;quot;{Binding SelectedItem.Value, Source={x:Reference ExamplePicker}, StringFormat='key={0}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Text Input in ListView Header Template ===&lt;br /&gt;
This implementation will not work when parts of it, such as the Input fields, are hosted in a ListView header or footer template, as this content is not readable by the rest of the page and will return a &amp;quot;Can not find the object referenced&amp;quot; parsing error.&lt;br /&gt;
&lt;br /&gt;
To workaround this, you need to move the Input control out of the header template.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
* Everything looks correct but filtering returns no results:&lt;br /&gt;
** Ensure that the string you are trying to filter by matches what is returned as the DisplayValue.&lt;br /&gt;
** If the property is a INT / DBL (Integer or Double) type: The string comparison doesn't work directly with non-string types. Check the [[HowTo:Implement_Custom_Filtering#Other_Property_Types|Other Property Types]] section.&lt;br /&gt;
** If filtering a DateTime property, ensure the formatting of the input matches that of the property value in the EXP string.&lt;br /&gt;
** If filtering a GUID property, ensure the same values are compared; DisplayString if the user is inputting readable text, UID if the user has selected an item from a list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[XAML]]&lt;br /&gt;
* [[XAML_Tips]]&lt;br /&gt;
* [[Xamarin_XAML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=XAML_Best_practices&amp;diff=28513</id>
		<title>XAML Best practices</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=XAML_Best_practices&amp;diff=28513"/>
				<updated>2025-08-18T12:14:25Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Context Switching And Templates */ restructured and added UWP example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This article recommends approaches to customizing and troubleshooting your UBIK custom UIs. &lt;br /&gt;
To learn about the fundamentals of XAML, check out our article [[XAML_Basics]].&lt;br /&gt;
&lt;br /&gt;
The most important specific Best Practices are marked with a 🏆&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Conventions ==&lt;br /&gt;
Conventions are ‘rules’ that make our xamls collectively readable and shareable. By aiming to construct our xaml files in a similar style, we reduce the effort required by others to read and understand our work. This section includes guidelines on how to name controls, and how to internally organize your xaml files.&lt;br /&gt;
&lt;br /&gt;
=== Naming Conventions ===&lt;br /&gt;
 &amp;lt;Button x:Name=&amp;quot;SubmitFormButton&amp;quot; ... /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The x:Name is used to give a unique name for an object within a xaml file. It’s not valid in a ResourceDirectory (such as a style, template, etc, either defined within a xaml file, or in UBIKThemes), which requires using x:Key instead.&lt;br /&gt;
** Likewise there is a difference when referencing x:Name and x:Key elements.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;x:Name - UWP: ElementName=SubmitFormButton | Xamarin: Source={x:Reference  SubmitFormButton}&lt;br /&gt;
 x:Key - Both: {StaticResource SubmitFormButtonStyle} or {DynamicResource SubmitFormButtonStyle}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Use explicit language when giving a name or key, for example: “PropStkpnl” is not easily readable, but “PropertiesStackPanel” is. &lt;br /&gt;
* Furthermore, “FailureCodeExpression” does not describe the purpose of the expression, whereas “FailureCode_HasUnfilledFields” does. &lt;br /&gt;
** Naming it according to its purpose also makes it easier to use in xaml, such as when combining the result with a converter for an intended outcome (eg. An warning symbol visible when FailureCode_HasUnfilledFields is true). &lt;br /&gt;
* You '''do not''' have to name every object in your code, only if it is referred to by another element. However, sometimes adding names to controls helps a reader understand their intended function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formatting ===&lt;br /&gt;
&lt;br /&gt;
Formatting xamls properly is critical to others being able to quickly read and understand a customizing. &lt;br /&gt;
{{Hint|If you struggle to maintain nice formatting while writing your xaml code, you can find formatters that automatically such as Notepad++’s “Pretty Print” or VS Code’s “XAML Styler” plugins.}}&lt;br /&gt;
&lt;br /&gt;
==== Best Practices ====&lt;br /&gt;
&lt;br /&gt;
* x: Name or x: Key should come first.&lt;br /&gt;
* A control with up to 2 Attributes can be added in one line. If it has more than 2, they should be stacked over another for readability. &lt;br /&gt;
** Avoid using a formatter where the indentation matches the name of the control&lt;br /&gt;
[[File:Formatting_Indentation.jpg]]&lt;br /&gt;
&lt;br /&gt;
* Add controls in a Top-to-Bottom order in the xaml file. Additionally, try to add them in a Left-to-Right order.&lt;br /&gt;
** Controls in Grid.Row/Column 0 should be higher up in your xaml file than controls placed in other rows and columns.&lt;br /&gt;
&lt;br /&gt;
* Respect indentation of nested controls.&lt;br /&gt;
** Opening and closing tags should always begin in the same column. &lt;br /&gt;
** Controls nested inside them should begin exactly one column to the right. &lt;br /&gt;
** When pasting code snippets into your work, be sure to correct the differences in indentations.&lt;br /&gt;
&lt;br /&gt;
* Use Linebreaks mindfully.&lt;br /&gt;
** It is difficult to describe rules for how linebreaks should be used, but the general idea is to use them to group elements in your xaml file, and to show which controls are nested (no linebreaks) and which controls are 'siblings' (divided by linebreaks).&lt;br /&gt;
** ✔️Put linebreaks in between large sections of a UI definition (eg. between Grids or major elements of the page, or between content set on different Rows/Columns).&lt;br /&gt;
** ❌ Avoid linebreaks in the middle of smaller elements (eg. a stackpanel with 2 texts inside).&lt;br /&gt;
&lt;br /&gt;
* 🏆 '''Add comments.'''&lt;br /&gt;
** This is one of the most critical features of clear code, saving the reader from wasting time struggling to read the code, or even having to search and ask around. &lt;br /&gt;
** Use comments to describe the position, purpose, and function of every control.&lt;br /&gt;
** When maintain xamls according to a ticket, put the ticket number in a comment so a reader has access to background information on the change.&lt;br /&gt;
[[File:Formatting_Comments.jpg]].&lt;br /&gt;
&lt;br /&gt;
* Remove unnecessary code. Ensure everything included in your xaml has a purpose. This includes large sections of commented out code.&lt;br /&gt;
** This both makes the xaml clearer, but also improves performance by avoiding unnecessary loading and rendering effort.&lt;br /&gt;
** This is especially true when copying from other’s work. &lt;br /&gt;
** If you’re not sure if something is necessary, comment it out and see if your xaml still fulfils its function. If it works, remove it.&lt;br /&gt;
** [[XAML_Best_practices#Performance | Read more in the next section on Performance]].&lt;br /&gt;
&lt;br /&gt;
* 🏆 '''Empty out your UBIKThemes''' for every new customizing.&lt;br /&gt;
** When working in Xamarin, it is recommended to empty out your UBIKThemes file (ie. delete everything between the &amp;lt;ResourceDictionary&amp;gt; tags) and only add what you intend to customize. &lt;br /&gt;
** Unfortunately, this approach is currently not 100% possible in UWP xamls, as we noticed that custom styles are not utilized on controls unless the controls are also in UBIKThemes, shown instead using the standard grey/orange. However, diligent customizers can find out how to do so below:  &amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Read More&amp;quot; data-collapsetext=&amp;quot;Close&amp;quot;&amp;gt; An issue with dynamically refreshing style resources causes emptying of UBIKThemes to be much more complicated on UWP than in Xamarin.&amp;lt;br&amp;gt;This is because StaticResources are only updated once they are overwritten again in Themes. The most common symptom of this issue is that for example, if UBIKAccentColor is changed to blue, this customization will not be reflected by styles for any control defined in UBIKThemes, unless the styles are 'written' again in UBIKThemes. So in this example, the regular button hover state will remain orange, unless UBIKButtonStyle is included in the UBIKThemes of that project.&amp;lt;br&amp;gt;Therefore, the only approach we can recommend is to remove everything from UBIKThemes, and add styles back once they fail to reflect the customized color resources. Since this approach is impractical, we do not encourage emptying UBIKThemes for UPW as strongly as we do for Xamarin.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Organize UBIKThemes in sections. &lt;br /&gt;
** For example, standard UBIKThemes defines resources grouped into; Color resource / Size resources / Text styles / Button styles / etc&lt;br /&gt;
** In Xamarin, keep Item Templates at the end of UBIKThemes.&lt;br /&gt;
** Either way, it is recommended to keep your UBIKThemes file as lean as possible (read the next point), as well as maintaining a grouping strategy. Use the tags &amp;lt;nowiki&amp;gt;&amp;lt;!--#region Example--&amp;gt;&amp;lt;/nowiki&amp;gt; and &amp;lt;nowiki&amp;gt;&amp;lt;!--#endregion--&amp;gt;&amp;lt;/nowiki&amp;gt; to define groups of content, for example &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;!--#region Text Styles--&amp;gt;, &amp;lt;!--#region DataTemplates--&amp;gt;, or &amp;lt;!--#region Item Templates--&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
A basic rule is that '''more code = more to compile''', and this can decrease the performance of your whole application. To counter that, always attempt to reduce the amount of xaml customizing, especially if you find yourself repeating specific controls and attributes.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Templating in UBIK ===&lt;br /&gt;
The most critical thing to understand about customizing your UI is that '''templates for the entire default UI are already present in the client’s core'''. Customizing templates allow us to modify of specific areas of the UI by overwriting the parts of the default UI with the same name. Therefore, only the specific xamls that need to be customized should be added. This is recommended for many reasons;&lt;br /&gt;
&lt;br /&gt;
* Custom xamls will ‘undo’ improvements to the UI coming from newer versions of the client, when they are based on xaml files from an older version of UBIK. For custom UIs there is no way around it, but this is why '''uncustomized copies of xamls should never be added to the project folder'''. To remove a customizing, simply delete that file. There is no need to replace it with an uncustomized version from the default folder.&lt;br /&gt;
* Less xaml files to parse means better performance.&lt;br /&gt;
* More xamls also makes it more difficult for others to read and understand the customizing. This also makes it much more difficult to find and diagnose errors when requesting support. It also generally increases the effort required to maintain the xamls.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check out the next section for a more in-depth look into [[XAML_Best_practices#Templating|Content Templating]].&lt;br /&gt;
&lt;br /&gt;
==== Best Practices ====&lt;br /&gt;
* 🏆 '''Deploy a new Default folder''' every time you update your client version, to ensure that the latest UI version is the foundation for your customizing.&lt;br /&gt;
* 🏆 '''Only include xamls that are needed for your customizing.'''&lt;br /&gt;
** Remove files for child Areas and Items that are not included in the project this customizing will be used for. This is especially relevant when copying customizings from other projects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to select the right Control ===&lt;br /&gt;
Controls often have similar functionality, making the question of which control to use highly ambiguous. &lt;br /&gt;
For clarity, a 'Control' refers to a single xaml object that can be added to your visual tree. These range in scope and purpose, from layouting (such as a Grid or StackPanel), to interactivity (such as a Button or TextBox), and everything in between (such as a ListView).&lt;br /&gt;
&lt;br /&gt;
So, how to choose the best control to meet your requirements?&lt;br /&gt;
&lt;br /&gt;
==== Best Practices ====&lt;br /&gt;
* 🏆 A good rule of thumb is to '''always use the least complex control possible'''. &lt;br /&gt;
** For example, there is no need to use a Filter + ListView to show a single UBIK object or property. Instead, you can bind the specific context of that object or property to a xaml control, and everything nested inside will inherit that binding context. This will be explained more in the section on [[XAML_Best_practices#Reusable_Templates|Reusable Templates]].&lt;br /&gt;
** Similarly, simple EvalExpressions can in many cases be replaced with [[XAML_Best_practices#Converters|Converters]].&lt;br /&gt;
** The Visibility attribute can be added to any control. '''There is no need to wrap any control in a Grid simply to apply a Visibility.''' The same goes for layouting attributes such as Grid.Row/Column.&lt;br /&gt;
* 🏆 When you need to show a collection of items such as ListView, '''always use our custom versions'''. These are UBIK-optimized for speed and performance.&lt;br /&gt;
** These are [[XAML_Tips#Version_3.7_.26_later|SelectionBoundListView]] on UWP and [[Xamarin_XAML#SfListViewExt|SfListViewExt]] on Xamarin.&lt;br /&gt;
** Avoid using other item controls, or BindableLayouts, unless you are sure the performance impact will be negligible.&lt;br /&gt;
* Layouts:&lt;br /&gt;
** If you want to define a specific layout for a page, use a Grid with rows and columns.&lt;br /&gt;
** If things need to be positioned relative to each other, use a StackPanel/StackLayout.&lt;br /&gt;
** When defining Rows/Columns for a Grid, assign as few Auto size as possible, and avoid putting controls of unlimited size in an Auto Row.&lt;br /&gt;
** 🏆 '''Never nest controls of unrestricted size within controls of unlimited size.'''&lt;br /&gt;
*** To clarify: Some controls resize themselves based on their content and can be of unlimited size. One example is a StackPanel/StackLayout, when compared to a Grid, which is limited to the screen's size. On the other hand, some controls have an unrestricted size, such as ListView, ScrollView, etc.&lt;br /&gt;
*** Furthermore: ListViews require a fixed size in order to preserve [[XAML_Best_practices#Virtualization|virtualization]].&lt;br /&gt;
* Do not nest ScrollViews within other ScrollViews. &lt;br /&gt;
** Note that this includes '''any''' control with scrolling behavior, as these include a hidden built-in ScrollView. For example, never place a ListView or TreeView within a ScrollView.&lt;br /&gt;
* Nested ListViews involves using a ListView on the item template of an object already presented in a collection. For example, showing the children of a child object.&lt;br /&gt;
**  This is especially an issue in Xamarin, both for performance, but also because sfListViewExt tends to cause layouting issues by taking up more space than needed, unlike in UWP where a ListViewExt is capable of calculating its size based on the size of its items. Therefore, when using nested ListViews in Xamarin, constrain the size of the inner ListView with a fixed HeightRequest attribute (or WidthRequest in the case of a horizontal list).&lt;br /&gt;
** 🏆 '''Alternatives to the optimized ListViews should be used with extreme caution.''' Controls such as CollectionView or BindableLayout are not optimized for good performance in UBIK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using Styles and Templates ===&lt;br /&gt;
Attributes are the properties used to customize the controls in a UI. The number of attributes on each control can also contribute to having 'too much' code. Reducing the number of attributes will improve the overall performance of a customizing, especially on elements that appear multiple times in the UI,s such as items in a list. &lt;br /&gt;
&lt;br /&gt;
[[XAML_Best_practices#Templating|Custom templates]] can be used with the additional benefits of defining a uniform look for all similar elements, and reducing customizing effort by creating a central point where a reusable template can be maintained.&lt;br /&gt;
&lt;br /&gt;
==== Best Practices ====&lt;br /&gt;
* Do not re-define default attributes.&lt;br /&gt;
** All attributes have a default value. For example, Grid.Row=&amp;quot;0&amp;quot; is always true, unless specified. Use the Microsoft documentation to familiarize yourself with the default value for every property, and avoid rewriting them. &lt;br /&gt;
** If your control inherits an attribute from its style, do not rewrite the same attribute again.&lt;br /&gt;
*** If you find yourself adding the same attributes to a control with a style, consider moving the attribute to the style definition, or creating a substyle.&lt;br /&gt;
* Avoid repeatedly applying Margins to individual controls.&lt;br /&gt;
** The main layouting should not be done through Margins. Instead, try to use a combination of Grid.Row/Column definitions and Horizontal/Vertical alignments to create your layout, instead of applying many or very large Margins. &lt;br /&gt;
** For example, if you want to move every control within your Grid away from the edge, use a Padding on the Grid instead of Margins on each of the elements.&lt;br /&gt;
** If you want to move controls away from each other within the same container, use RowSpacing or ColumnSpacing on the Grid, or Spacing on the Stackpanel.&lt;br /&gt;
* 🏆 If you repeatedly define the same attributes on a control, '''create a style'''.&lt;br /&gt;
** If the repeated customizing is used in only one xaml, create a ResourceDictionary on the parent container and defining your style there. &lt;br /&gt;
** Otherwise, place your style in UBIKThemes so it can be accessed across the entire project.&lt;br /&gt;
** '''For more information, read the section on [[XAML_Best_practices#Implicit_and_Explicit_Styling|Implicit and Explicit Styling]] below.'''&lt;br /&gt;
* 🏆 If you repeatedly define the same combinations of controls, '''use Control/DataTemplates'''.&lt;br /&gt;
** DataTemplates and ControlTemplates are reusable XAML elements that can be defined once and applied several times throughout the customizing.&lt;br /&gt;
** You may have noticed that a DataTemplate is the basis for an item template in UBIKThemes. However, these can be applied anywhere in the xaml, and do not require a ListView to be rendered.&lt;br /&gt;
** '''For more information, read the section on [[XAML_Best_practices#Templating|Content Templating]] below.'''&lt;br /&gt;
* 🏆 '''Reduce the number of elements, especially containers''', wherever possible.&lt;br /&gt;
** Layouts are often defined in multiple nested containers, usually Grids and StackPanels. This has an impact on performance if it leads to a very deep hierarchy of rendered elements. On mobile devices with less computational power, the difference can be felt. &lt;br /&gt;
** Creative use of basic controls can sometimes eliminate the need for additional visual elements.&lt;br /&gt;
** Frequent use of Grids or Stackpanels can sometimes be replaced with clever use of Grid.Row/Column definitions.&lt;br /&gt;
* Layout Compression:&lt;br /&gt;
** Sometimes it’s unavoidable that multiple containers are needed. In Xamarin, applying the [[Xamarin_XAML#Layout_compression_examples|HeadlessLayout]] style can reduce their impact on the visual tree. &lt;br /&gt;
** Some ideas for reducing the number of nested controls can be seen [[XAML_Best_practices#Alternatives_to_using_Multiple_Controls|later in this article]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Implicit and Explicit Styling ====&lt;br /&gt;
A Style is a collection of preset attributes that can be assigned to a XAML control of the same type. &lt;br /&gt;
When this is done directly, by adding the Style attribute to a control, it is called Explicit Styling.&lt;br /&gt;
However, styles can also be made Implicit, by not assigning an x:Key, making it a default style. Whether it is the default style for a localized section of a XAML, or the entire project, depends on where the Implicit style is defined.&lt;br /&gt;
&lt;br /&gt;
The following code snippet makes use of several features of XAML Styling:&lt;br /&gt;
[[File:Performance_ImplicitStyling.jpg]]&lt;br /&gt;
&lt;br /&gt;
* The above is an example of a localized ResourceDictionary used to avoid repeatedly customizing similar controls. &lt;br /&gt;
* By not assigning an x:Key to the style in the Grid.Resources, it will be used as the Implicit style for all Labels within that StackPanel unless a Style is assigned to them.&lt;br /&gt;
** All Labels within the StackPanel will inherit the defined style, except for &amp;quot;The result is:&amp;quot;, which is given an explicit style, overriding the inherited implicit one.&lt;br /&gt;
** If no Explicit style is assigned, the Implicit style will be assigned first, and will be overwritten by any defined attributes, like TextColor in the above example.&lt;br /&gt;
* The localized Style definitions in this StackPanel will be passed down to all controls contained within it, no matter how deep the nesting goes.&lt;br /&gt;
* The BasedOn attribute can be used to create a sub-style based on another existing style. However, the TargetType must always match.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simplifying Layouts ===&lt;br /&gt;
In UWP / on desktop UBIK, the processor is generally powerful enough to handle more complex UIs. However, mobile devices running Xamarin versions of UBIK will noticeably struggle to render sophisticated UIs made of deeply nested levels of containers. There are two ways this situation can be improved; the first is to reduce the number of containers used, and the second is to apply [[Xamarin_XAML#Layout_compression_examples|Layout Compression]] wherever possible. Finally, some ideas will be presented for other ways to reduce the number of controls needed to render the same UI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reducing Containers ====&lt;br /&gt;
Containers refers to controls whose purpose is to display other controls. The most basic examples are the Grid and StackLayout. These containers are frequently nested in order to finetune a UI, however, the downside is that each one adds a new branch in what is called a &amp;quot;visual tree', even if the control itself is not visible. When using many containers, it is useful to ask yourself if each container is really necessary, or if the visual tree can be simplified. &lt;br /&gt;
&lt;br /&gt;
The examples below show three different ways for showing the same content, each utilizing less controls, leading to a simpler visual tree. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;2 StackLayouts, 3 Labels&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;StackLayout&amp;gt;												&lt;br /&gt;
    &amp;lt;StackLayout Orientation=&amp;quot;Horizontal&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{x:Static resources:UBIKIcons.IconName}&amp;quot; FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot;/&amp;gt;						&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;Name&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;Description&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/StackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;1 Grid, 3 Labels&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Grid Grid.ColumnDefinitions=&amp;quot;24,*&amp;quot; Grid.RowDefinitions=&amp;quot;Auto,Auto&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label Text=&amp;quot;{x:Static resources:UBIKIcons.IconName}&amp;quot; FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot;/&amp;gt;						&lt;br /&gt;
    &amp;lt;Label Grid.Column=&amp;quot;1&amp;quot; Text=&amp;quot;Name&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Label &lt;br /&gt;
        Grid.Row=&amp;quot;1&amp;quot; &lt;br /&gt;
        Grid.ColumnSpan=&amp;quot;2&amp;quot; &lt;br /&gt;
        Text=&amp;quot;Description lorem ipsum...&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;1 Label&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label&amp;gt;&lt;br /&gt;
    &amp;lt;Label.FormattedString&amp;gt;&lt;br /&gt;
        &amp;lt;FormattedText&amp;gt;&lt;br /&gt;
            &amp;lt;Span FontFamily=&amp;quot;{StaticResource UBIKSymbols}&amp;quot; Text=&amp;quot;{x:Static resources:UBIKIcons.IconName}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Span Text=&amp;quot;Name &amp;amp; #10;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Span Text=&amp;quot;Description lorem ipsum...&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/FormattedText&amp;gt;&lt;br /&gt;
    &amp;lt;/Label.FormattedString&amp;gt;&lt;br /&gt;
&amp;lt;/Label&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: &amp;amp; #10; (without the blank space) is the Xamarin glyph code for a newline. The equivalent in UWP is &amp;amp; #x0a;.&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now imagine the UI element should have a colored background. You may be tempted to wrap everything in a Frame, however, you can just as easily assign color using the Background attribute on the StackLayout, Grid, or even the Label itself.&lt;br /&gt;
&lt;br /&gt;
Granted, this example is very simple, however, the point illustrated here is that you should fid creative ways to reduce the number of controls nested in your UI.&lt;br /&gt;
&lt;br /&gt;
Another thing to consider is how many times this particular UI definition will be rendered on screen. You have more freedom to be uneconomical in your use of controls when when designing items that will appear once on a page, such as the page header, rather than with item templates or control templates that are rendered several, or even dozens, of times in one view. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Layout Compression ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Alternatives to using Multiple Controls ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Performance analysis (MAUI only) ===&lt;br /&gt;
In the MAUI app, {{UBIK}} provides customizers a possibility to analyze the performance of specific UI elements by measuring the time it takes to render them. This can help customizers find performance weak spots in the entire UI and also serve as a benchmarking tool to verify the result of any improvement attempts.&lt;br /&gt;
The measurement is achieved through the use of the MeasurePerformanceBehavior. The concept of it is very similar to other behaviors, namely you attach it to any UI element in the XAML code (as long as it's a derivate of the [https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.controls.visualelement?view=net-maui-9.0 VisualElement], which should cover the vast majority of all UI element types).&lt;br /&gt;
* The behavior measures the time to render the UI element (which it attaches to) as well as its child elements (recursively if any).&lt;br /&gt;
* You can attach multiple behaviors to multiple UI elements at the same time, one to each, in order to get the measurements of the different elements.&lt;br /&gt;
* The measurements are logged in the UBIKDebug.log file under the app's Logs folder.&lt;br /&gt;
* You can and should assign a unique name to the Label property of the behavior, so that it's easy to identify the render time of the target element.&lt;br /&gt;
&lt;br /&gt;
The following is an example of attaching the behavior to the root Grid inside the UBIKChildItem template. It should effectively measure the time to render the UI for a child item.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;MAUI&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Namespace referenced in the code: &amp;lt;code&amp;gt;xmlns:behaviors=&amp;quot;clr-namespace:UBIK.MAUI.Behaviors;assembly=UBIK.MAUI&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
    &amp;lt;Grid.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:MeasurePerformanceBehavior Label=&amp;quot;UBIKChildItemRootGrid&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid.Behaviors&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this, you should see log entries such as the following, one for every child item that you see when opening a content page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;2025.07.15 12:12:18:1030 Debug   Sender: MeasurePerformanceBehavior  Message:'Rendering Microsoft.Maui.Controls.Grid UBIKChildItemRootGrid took 8.4889 ms'&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Pages with broken file links|XAML Best practices]]&lt;br /&gt;
[[Category:XAML|XAML Best practices]]&lt;br /&gt;
&lt;br /&gt;
== Templating ==&lt;br /&gt;
Similar to styling single controls, presets featuring groups of controls can also be defined in UBIKThemes and used anywhere in the client. The benefit of this&lt;br /&gt;
&lt;br /&gt;
One simple example of this is an ItemTemplate. Project customizers should be familiar with ItemTemplates, which are defined in UBIKThemes and then applied to every item in a List, for example. However, such templates are not inherently connected to listviews, and can be used on any items control, or can even on their own, if the situation calls for it. The important thing to understand is that a content template is a standalone unit, defined in xaml to display particular data bindings, and perhaps react to various states.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{Hint|Look at other interesting templates in UBIKThemes, such as &amp;quot;Badge&amp;quot; / &amp;quot;ChildCountBadge&amp;quot; in Xamarin, or &amp;quot;UBIKObjectIndicators&amp;quot; in UWP to see more ideas for how templates can be utilized.}}&lt;br /&gt;
&lt;br /&gt;
=== Template Selectors ===&lt;br /&gt;
Various parts of the UBIK UI are dynamically swapped in based on specific conditions. One example is the UBIKPropertyDirectItemContainer.xaml, which serves as the base for an item in the property list, and which renders a different type-appropriate editing UI for each kind of property input (such as TextBox for manual input String, Double, or Integer; selection for link properties, or list-based String, Double, or Integer; clock and calendar pickers for DateTime; Lat., Lon., and Alt. input for geo coordinates, etc).&lt;br /&gt;
&lt;br /&gt;
The logical tree used by these selectors to render different UIs is documented in our article [[UBIK_Templates]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DataTemplate vs. ControlTemplate in Xamarin ===&lt;br /&gt;
There are two main types of templates that can be used in UBIK to define reusable clusters of controls. Ignoring the technical differences, the functional differences boil down to;&lt;br /&gt;
==== DataTemplate ====&lt;br /&gt;
DataTemplate is used for showing / interacting with various aspects of a data binding. &lt;br /&gt;
* Example 1: Consider a Child ItemTemplate, which is capable of displaying metadata like Title or SubTitle, MetaProperty collections, Classifications, Children and Documents. In this case, the '''context''' for the item template is one object, and we can bind to any of its data. &lt;br /&gt;
* Example 2: Consider a Property ItemTemplate, where we can view or edit a metaproperty. In this case, the '''context''' of the ItemTemplate would be a single property, and the bindings available would reflect that; we can bind to its Description, Value, DisplayString, Unit, or even its SortedValueRecords, if property change history is activated.&lt;br /&gt;
* Use a '''ContentControl''' or our custom '''controls:ContentControl''' (with the attribute ContentTemplate=&amp;quot;{DynamicResource ...}&amp;quot; and TemplateContext=&amp;quot;{Binding ...}&amp;quot;)  to display it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ControlTemplate ====&lt;br /&gt;
ControlTemplate is technically used for showing how a specific control can be used; for example, if you want to customize a new template for how a Button should appear. However, it can be used similar to the DataTemplate, with one added bonus; its ContentPresenter sub-control allows for dynamically adding content at every instance, as opposed to a single universal layout that is shared by all.&lt;br /&gt;
* For example: The screenshot below shows three areas navigated to by clicking on root objects. Each has a potentially large collection of their own metaclass of children, meaning that each page benefits from filters, but they do not filter the same properties. However, some details are common, such as the item and filter count texts, and the button to remove all filters. &lt;br /&gt;
[[File:Templating_ControlTemplate.jpg]] &lt;br /&gt;
* The general layout could be created with two columns, one for the counts and button, with the rest of the space dedicated to the individual filters. The template would then be applied one in each of the child areas, with their specific filters nested inside the ContentView used to display the filter. &lt;br /&gt;
* During runtime, the &amp;lt;ContentPresenter /&amp;gt; defined in the ControlTemplate will be replaced with whatever content is nested in the ContentView.&lt;br /&gt;
* Note that implicit styles can also be added to the ControlTemplate, and will be inherited by any content nested in the ContentView.&lt;br /&gt;
* Use a '''ContentView''' (with the attribute ControlTemplate=&amp;quot;{DynamicResource ...}&amp;quot;) to display it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Since the ControlTemplate is not technically designed to work directly with data bindings, it does inherit the context from its ContentView by default. However this can be easily fixed by adding the &amp;lt;nowiki&amp;gt;BindingContext=&amp;quot;{TemplateBinding BindingContext}&amp;quot;&amp;lt;/nowiki&amp;gt; attribute to the root grid of the template.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hint|An understanding of '''Contexts''' is fundamental to using templates, as this informs what data bindings are directly available. Some more information can be found at this article on [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#The_ContentViewModel.28s.29|the ContentViewModel]] }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ControlTemplate in UWP ===&lt;br /&gt;
The situation is much simpler in UWP, which only makes use of the ControlTemplate to define custom templates. The ControlTemplate in UWP inherits the context from its content control, so no equivalent to Xamarin's &amp;lt;nowiki&amp;gt;BindingContext=&amp;quot;{TemplateBinding BindingContext}&amp;quot;&amp;lt;/nowiki&amp;gt; is required.&lt;br /&gt;
 &lt;br /&gt;
The ContentControl is used to render an instance of a template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Contexts and Context Switching ===&lt;br /&gt;
In xaml, every element in the UI is informed by a '''context'''. This is the data that is delivered by UBIK immediately when binding. Knowing the context that will be used by a content control is vital when using templates, as this directly affects what bindings you can prepare in your template. Furthermore, all content views that use the same template must have similar contexts, to a degree.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
Two of the more frequently customized elements are Objects and their Metaproperties. A template used for a UBIK object will have bindings such as Title, Values[PROPERTY], etc, whereas one designed for a Metaproperty will have DisplayValue, Description, Unit, and so on. Using a template designed for a UBIK object will have no benefit if the context applied to it is that of a property, and vice versa.&lt;br /&gt;
&lt;br /&gt;
==== Where does the context come from? ====&lt;br /&gt;
Context is inherited. When you begin customizing a xaml template, it generally has a known use, such as a child area, document viewer, or item in a property list, to name just a few of many. In these cases, the context is quite clear. However, when you begin creating general templates that can be used anywhere in the client, there will likely be the need to specify what context should be applied each time the template is used. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:XBP_ContentTemplates.png]]&lt;br /&gt;
&lt;br /&gt;
In the above example, we see a variety of property editing fields. To cut down on repetitive XAMLing, a template is created for inputting a single property, consisting in this case of Description, DisplayValue, a placeholder label, and some indicators such as whether the property is required or filled. In each case, the context needs to be set to a specific metaproperty defined on the 'controls:ContentControl' that hosts each instance of the template, through the TemplateContext attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl&lt;br /&gt;
    ContentTemplate=&amp;quot;{DynamicResource PropertyField_Required}&amp;quot;&lt;br /&gt;
    TemplateContext=&amp;quot;{Binding Properties.VisibleItems[MP_DETECTION]}&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;controls:ContentControl.GestureRecognizers&amp;gt;&lt;br /&gt;
        &amp;lt;TapGestureRecognizer Command=&amp;quot;{Binding Properties.VisibleItems[MP_DETECTION].PropertyClickedCommand}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/controls:ContentControl.GestureRecognizers&amp;gt;&lt;br /&gt;
&amp;lt;/controls:ContentControl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Adding the behavior to the ContentControl, rather than defining it in the template itself, allows flexibility in the customizing as different property-editing commands can be paired with the same UI based on the required functionality.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Context Switching ====&lt;br /&gt;
To repeat, context is almost always inherited. If you forget to assign a specific context to a content control (as in the above example), the context of the XAML element that hosts that content control will be used. When you think about it, any number of nested Grids still inherit the context of the area or item template they are hosted in. &lt;br /&gt;
&lt;br /&gt;
Context-switching is simply the name given to the act of assigning a different context to a particular control, when needed. It is also usually very simple to do:&lt;br /&gt;
&lt;br /&gt;
'''UWP'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
DataContext=&amp;quot;{Binding ...}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Xamarin'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
BindingContext=&amp;quot;{Binding ...}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The above attributes can be added to any control to change it's binding context.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Try this experiment:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock &lt;br /&gt;
    DataContext=&amp;quot;{Binding ParentLevel}&amp;quot;&lt;br /&gt;
    Text=&amp;quot;{Binding Title}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By using this code snippet, we expect to see the Title or the current object. However, because we have a context switch applied, we would instead see the Title of the parent object. For Xamarin use '''Label''' instead of TextBlock and '''BindingContext''' instead of DataContext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|Using this technique to switch the context of a control does it for ''all bindings on that control''. Since the entire control is now 'focused' directly on a different context, existing bindings will need to be adapted. An easy example is the Visibility of the TextBlock, which we might still want to bind to certain conditions on the child object, while displaying the data of the parent. &lt;br /&gt;
&lt;br /&gt;
One exception is the controls:ContentControl, which through its TemplateContext attribute accepts the possibility to have a different context for its content, therefore decoupling the context of the template from the actual control, [[XAML_Best_practices#Context_Switching_And_Templates|as described below]].}}&lt;br /&gt;
&lt;br /&gt;
Furthermore, since context continues to be inherited, any controls contained within the context-switched one (imagine it's a Grid containing more elements, rather than a simple TextBlock) will all also have the context of ParentLevel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Context Switching And Templates ====&lt;br /&gt;
&lt;br /&gt;
===== '''DataTemplate''' =====&lt;br /&gt;
As described in the previous section, DataTemplates are designed to be used as templates for data contexts, therefore the content control used to render them, controls:ContentControl, has the TemplateContext property which allows you to set the binding context '''for the template'''. The important difference to note is that the controls:ContentControl itself will not use the TemplateContext, but rather the inherited context from its hosting xaml. &lt;br /&gt;
&lt;br /&gt;
Because they are independent of each other, it allows more sophisticated usage of binding contexts, for example, when ''Object A'' has ''Status B'', show ''Property C''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentControl (displayed on child area of Object A)&lt;br /&gt;
    Visibility=&amp;quot;{Binding Values[STATUS], Converter={StaticResource EqualToVisConverter}, ConverterParameter=B}&amp;quot;&lt;br /&gt;
    Content=&amp;quot;{Binding PropertyItems[PROPERTYC]}&amp;quot;&lt;br /&gt;
    ContentTemplate=&amp;quot;{StaticResource MyPropertyTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:ContentControl (displayed on child area of Object A)&lt;br /&gt;
    IsVisible=&amp;quot;{Binding Values[STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=B}&amp;quot;&lt;br /&gt;
    TemplateContext=&amp;quot;{Binding PropertyItems[PROPERTYC]}&amp;quot;&lt;br /&gt;
    ContentTemplate=&amp;quot;{StaticResource MyPropertyTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== '''ControlTemplate''' =====&lt;br /&gt;
On the other hand, since the ControlTemplate is not designed to be used this way, it has no inherent binding context attribute that can be assigned to it's content only. The only benefit of using a ControlTemplate over a DataTemplate is the possibility to nest dynamic content (that has not been defined in the original ControlTemplate) within in, by use of the &amp;lt;nowiki&amp;gt;&amp;lt;ContentPresenter... /&amp;gt;&amp;lt;/nowiki&amp;gt; attribute.&lt;br /&gt;
&lt;br /&gt;
To use it this way would therefore require a context switch on the ContentView used to render it, with the related adjustments required to bindings placed on the ContentView itself;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
No example yet.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView (displayed on child area of Object A)&lt;br /&gt;
    BindingContext=&amp;quot;{Binding PropertyItems[PROPERTYC]}&amp;quot;&lt;br /&gt;
    IsVisible=&amp;quot;{Binding CallingViewModel.Values[STATUS], Converter={StaticResource EqualityToBool}, ConverterParameter=B}&amp;quot;&lt;br /&gt;
    ControlTemplate=&amp;quot;{StaticResource MyOtherPropertyTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|CallingViewModel (as used on the IsVisible attribute) can be added to a metaproperty's binding path to bind to its context object.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|Remember that Styling in Xaml is type-based, so you cannot use the same template with controls:ContentControl (ContentTemplate attribute) and ContentView (ControlTemplate attribute), as DataTemplate and ControlTemplate are technically different types.}}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Pages with broken file links|XAML Best practices]]&lt;br /&gt;
[[Category:XAML|XAML Best practices]]&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
Diminishing the performance should not be the first priority but it also shouldn’t be the last. You should always think about retaining readability and consistency in your code by adding comments and using clear and significant code. But you also have to keep in mind that more code and lines mean more compiling, this can decrease the performance of your whole application. Just try to keep a good balance between these two factors in order to ease the life of customizers. They’ll surely stumble across your code in a few months and will maybe have a hard time to finalize a ten-minute task because they have to find out what every piece of code exactly does. Here are some examples which support the increase of performance.&amp;lt;br&amp;gt;&lt;br /&gt;
For example:&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the same resource on more than one XAML file, consider defining it in UBIKThemes (Resources Folder -&amp;gt; LocalState/XAML) rather than on each page. &amp;lt;br&amp;gt;&lt;br /&gt;
* Don't define UI elements you don't need for composition and use the default control templates whenever possible (these templates have already been tested and verified for load performance). &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Useful links for inefficient XAML code: &amp;lt;br&amp;gt;&lt;br /&gt;
* https://www.codemag.com/Article/1509091/XAML-Anti-Patterns-Layout-SNAFUs &amp;lt;br&amp;gt;&lt;br /&gt;
* https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-xaml-loading&lt;br /&gt;
&lt;br /&gt;
=== Using 'NextLevel' bindings ===&lt;br /&gt;
Performance can be impacted by attempting to show multiple levels of data (ie. child data, from the parent object) outside what is delivered by UBIK by default.&lt;br /&gt;
&lt;br /&gt;
For an in-depth explanation, and guidance on how to implement such functionality safely, please refer to this page [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testing of UI ==&lt;br /&gt;
XAML can be sometimes very weird, there are dependencies or default values that you don’t see immediately. So, a good way to prevent millions of fixes for the customer, because the environment, different device or even a different windows version destroys your UI, is to write a test plan where you test your implementation. It’s important to see exactly your controls in action on their own and acting with each other, so you can prevent doing lots of ‘easy’ fixes.&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
&lt;br /&gt;
== Improving performance on complex List item templates ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
Performance issues in XAML-based UI development often stem from unnecessary UI rendering and binding errors. Hidden elements remain in the UI tree, impacting performance, while premature bindings cause background errors. To optimize complex list item templates, UI content can be loaded only when needed, and binding errors can be reduced by applying view models at the control level. These improvements enhance efficiency, reduce log clutter, and improve maintainability.&lt;br /&gt;
&lt;br /&gt;
=== Technique 1: Loading UI content on demand ===&lt;br /&gt;
It was discovered that UI controls hidden with '''IsVisible=False''' remain in the UI tree. To improve performance on highly complex item templates, like UBIKTaskItem, rendered repeatedly such as in ListViews, a workaround can be applied to only load the UI content when the '''visibility''' binding condition is met. &lt;br /&gt;
&lt;br /&gt;
==== Previous Approach ====&lt;br /&gt;
Previously, we used '''IsVisible''' directly with a binding condition. The approach looked like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Label IsVisible=&amp;quot;{Binding MROViewModel.PreviousValue, Converter={StaticResource NullToNotBool}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label.FormattedText&amp;gt;&lt;br /&gt;
        &amp;lt;FormattedString&amp;gt;&lt;br /&gt;
            &amp;lt;Span Text=&amp;quot;{Binding MROViewModel.PreviousValue}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Span Text=&amp;quot; &amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Span Text=&amp;quot;{Binding MROViewModel.Unit}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/FormattedString&amp;gt;&lt;br /&gt;
    &amp;lt;/Label.FormattedText&amp;gt;&lt;br /&gt;
&amp;lt;/Label&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Improved Approach ====&lt;br /&gt;
To prevent unnecessary loading of UI elements when their '''visibility''' is False, it is possible to replace the UI content with a content hosting control, such as a '''ContentView''' or '''ContentControl'''. The original content should instead be defined as a template in '''UBIKThemes''', as shown below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView&amp;gt;&lt;br /&gt;
    &amp;lt;ContentView.Triggers&amp;gt;&lt;br /&gt;
        &amp;lt;DataTrigger Binding=&amp;quot;{Binding MROViewModel.PreviousValue, Converter={StaticResource NullToNotBool}, TargetNullValue=false, FallbackValue=false}&amp;quot;&lt;br /&gt;
            Value=&amp;quot;True&amp;quot; TargetType=&amp;quot;ContentView&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Setter Property=&amp;quot;ControlTemplate&amp;quot; Value=&amp;quot;{StaticResource PreviousValueTemplate}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;
    &amp;lt;/ContentView.Triggers&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The important part of the snippet above is the '''DataTrigger'''. Through this technique, the '''ControlTemplate''' of the content hosting control is only set once the visibility condition is met, preventing the UI content from being loaded until it is explicitly required.&lt;br /&gt;
And the associated '''ControlTemplate''', located in UBIKThemes:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ControlTemplate x:Key=&amp;quot;PreviousValueTemplate&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Label&amp;gt;&lt;br /&gt;
        &amp;lt;Label.FormattedText&amp;gt;&lt;br /&gt;
            &amp;lt;FormattedString&amp;gt;&lt;br /&gt;
                &amp;lt;Span Text=&amp;quot;{TemplateBinding BindingContext.MROViewModel.PreviousValue}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Span Text=&amp;quot; &amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Span Text=&amp;quot;{TemplateBinding BindingContext.MROViewModel.Unit}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/FormattedString&amp;gt;&lt;br /&gt;
        &amp;lt;/Label.FormattedText&amp;gt;&lt;br /&gt;
    &amp;lt;/Label&amp;gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Why This Change?'''&lt;br /&gt;
* '''More Modular''': The separation into discrete templates makes individual UI elements reusable and maintainable.&lt;br /&gt;
* '''Better Performance''': Eliminates unnecessary loading of UI elements in the background, that are not visible to the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technique 2: Reducing background Binding errors ===&lt;br /&gt;
&lt;br /&gt;
Complex item templates such as UBIKTaskItem were found to produce large numbers of '''errors''' while rendering, likely as bindings are being resolved before the relevant '''viewmodels''' can be loaded by the client. While these '''errors''' are temporary and not visible to the user, the cumulative effect of numerous binding errors raised while rendering items can be felt when navigating to pages with large numbers of items.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{Attention|Unfortunately, these bindings errors are not normally logged in the UBIKDebug.log. Therefore, the recommendation is to use the following technique whenever using a ContentControl or controls:ContentControl.}}&lt;br /&gt;
&lt;br /&gt;
==== Previous Approach ====&lt;br /&gt;
Initially, we used a '''ContentControl''' with a direct '''ContentTemplate''' and '''TemplateContext''', as shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:ctrls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;MAUI&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:ctrls=&amp;quot;clr-namespace:UBIK.MAUI.Controls;assembly=UBIK.MAUI&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ctrls:ContentControl&lt;br /&gt;
    ContentTemplate=&amp;quot;{StaticResource TaskPropertyTemplateSelector}&amp;quot;&lt;br /&gt;
    TemplateContext=&amp;quot;{Binding MROViewModel}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Binding_logs.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Improved Approach ====&lt;br /&gt;
One workaround that reduced the number of '''binding errors''' encountered was to refer to '''viewmodels''' indirectly in the bindings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ctrls:ContentControl x:Name=&amp;quot;TaskPropertyTempSelCtrl&amp;quot;&lt;br /&gt;
    BindingContext=&amp;quot;{Binding MROViewModel}&amp;quot;&lt;br /&gt;
    TemplateContext=&amp;quot;{Binding BindingContext, Source={x:Reference TaskPropertyTempSelCtrl}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/ctrls:ContentControl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The previous example used an '''MROViewModel''' binding directly in the '''TemplateContext''' property of the '''&amp;lt;ctrls:ContentControl&amp;gt;.''' &lt;br /&gt;
However, a workaround that seems to avoid triggering background binding errors is to apply the '''MROViewModel''' to the '''&amp;lt;ctrls:ContentControl&amp;gt;''' itself via the '''BindingContext''' property, and then request that '''BindingContext''' using the x:Reference syntax seen in the '''TemplateContext''' property. &lt;br /&gt;
&lt;br /&gt;
'''Why This Change?'''&lt;br /&gt;
* '''Avoids Additional Binding Errors''': Using this workaround seems to prevent binding errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Pages with broken file links|XAML Best practices]]&lt;br /&gt;
[[Category:XAML|XAML Best practices]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28478</id>
		<title>HowTo:Implement Custom Filtering</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28478"/>
				<updated>2025-08-11T09:58:31Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Comparison */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to customize filtered lists that accept one or multiple user inputs as filter criteria (referred to as 'Dynamic'), alone or combined with predefined criteria(referred to as 'Static'). The following examples are based on the Children.Items collection, however, Properties or Documents can be filtered too, by adjusting the ItemsSource in the &amp;lt;cv:ListCollectionView&amp;gt; or &amp;lt;controls:SfDataSourceExt&amp;gt; in UWP or Xamarin respectively. &lt;br /&gt;
&lt;br /&gt;
{{Attention|Are you sure you need this?&amp;lt;br&amp;gt;UBIK has a simpler out-of-the-box Property-based filtering technique for filtering child objects when one or multiple property value inputs are the only type of criteria required. See [[Property_Based_Content_Filters]]}}&lt;br /&gt;
&lt;br /&gt;
Four elements are required for Custom Filtering:&lt;br /&gt;
* Input field - for user inputs.&lt;br /&gt;
* [[EvalExpression]] - for converting user inputs into a filter expression.&lt;br /&gt;
* Collection Filter - for applying the expression to a collection.&lt;br /&gt;
* Items control - for displaying the filtered items.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This system acts dynamically to output the filtered list, without requiring the use of an Evaluation button, and directly outputs all items that match the filter input.&lt;br /&gt;
&lt;br /&gt;
This page will first describe the basic implementation of a single dynamic input, then describe how to allow for multiple inputs, and finally, how to combine multiple dynamic inputs with static, predefined criteria.&lt;br /&gt;
However, keep in mind that for simply dynamically filtering child objects based on single or multiple property values, this complex customizing is not required. Instead, this technique gives the possibility to create multiple collections based on the same child collection, each with individual filters that do not interfere with each other, or else to create filters based on dynamic inputs for Properties or Documents, which are not handled by the Content-Based Filtering functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Basic Implementation ==&lt;br /&gt;
To build the filter in XAML, you will need to place an EvalExpression and a Collection Filter in the Resources of your container (most likely, a Grid). In the container's content, you will need the Input control, and the items control as an output (most likely a ListView).&lt;br /&gt;
&lt;br /&gt;
The following namespaces are used:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
For UWP, it is possible to place the EvalExpression and Collection Filter into the &amp;lt;Grid.Resources&amp;gt;, as shown below. However, for Xamarin, it is required to use the &amp;lt;ContentView.Resources&amp;gt;.&lt;br /&gt;
For the Collection Filter, use [[XAML_Changes_in_UBIK_WinX_3.5#Filtering_by_expressions|ListCollectionView]] for UWP &amp;amp; [[Xamarin_XAML#FeatureRelated|Content_filtering]] for Xamarin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
	&amp;lt;cv:ListCollectionView&lt;br /&gt;
		x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
		Expression=&amp;quot;{Binding ElementName=FilterExpression, Path=Result}&amp;quot;&lt;br /&gt;
		ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note that the EvalExpression in UWP requires an x:Name, which in turn requires the 'ElementName' syntax seen in the &amp;lt;cv:ListCollectionView&amp;gt;.}}&lt;br /&gt;
{{Attention|Note that the Converter seen in the 'EXP' EvalExpressionParameter in UWP is 'StringFormatConverter', which is different than in Xamarin.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
		&amp;lt;controls:SfDataSourceExt &lt;br /&gt;
			x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
			Expression=&amp;quot;{Binding Source={StaticResource FilterExpression}, Path=Result}&amp;quot;&lt;br /&gt;
			ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; &lt;br /&gt;
                         Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|Note that Unloaded attribute improves performance by preventing refiltering while navigating away from the page. This attribute should be added to all instances of controls:SfDataSourceExt in your customizing.}}&lt;br /&gt;
{{Hint|Note that the EvalExpression in Xamarin requires an x:Key, which in turn requires the 'StaticResource ' syntax seen in the &amp;lt;controls:SfDataSourceExt&amp;gt;.}}&lt;br /&gt;
{{Hint|Note that the Converter seen in the 'EXP' EvalExpressionParameter in Xamarin is 'StringFormat', which is different than in UWP.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The EvalExpression Expression first checks whether the TextBox input is empty (as this would otherwise incorrectly be considered a filter input, whereby the property should be empty) and if so returns the unfiltered list (expression outcome hardcoded to 'true'), otherwise, applies the filter (expression outcome is taken from string constructed in ConverterParameter of 'EXP').&lt;br /&gt;
&lt;br /&gt;
There are two important details of the EvalExpressionParameter to note here: &lt;br /&gt;
* The &amp;quot;ElementName=NameInput&amp;quot; / &amp;quot;x:Reference NameInput&amp;quot; should match exactly to the name of your Input control.&lt;br /&gt;
* The Item.Values[&amp;amp;quot;NAME&amp;amp;quot;] should be adapted, by changing NAME to the property that should be filtered by this input.&lt;br /&gt;
&lt;br /&gt;
=== TextBox / Entry ===&lt;br /&gt;
The input field is just a basic &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt; we will use to input the filter criteria value. The only important detail for this input control is the name, which must be passed back to the EvalExpressionParameter.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It will look like this:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Items control  ===&lt;br /&gt;
An items control will likely be used for displaying filtered results, such as &amp;lt;controls:SelectionBoundListView&amp;gt; for UWP &amp;amp; [[Xamarin_XAML#Performance|SfListViewExt]] for Xamarin:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SelectionBoundListView&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryList&amp;quot;     &lt;br /&gt;
       ItemsSource=&amp;quot;{StaticResource FilterView}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
       ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilterView}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multiple Dynamic (User Inputs) Criteria ==&lt;br /&gt;
It is likely that the customizing is required to process multiple user inputs for the same filter. In this case, the EvalExpression must be adapted to combine the inputs (most likely using an AND relation, for a 'filtering-down' effect), as well as to deliver the full list when nothing is inputted.&lt;br /&gt;
A &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt;, and an EvalExpression, will be required for every additional property, as well as a final EvalExpression to combine them.&lt;br /&gt;
&lt;br /&gt;
The EvalExpressions should be amended as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows how to check for inputs to either property, NAME and DESCR, then use an additional EvalExpression to create the expression string that combines them. For each additional property you need to:&lt;br /&gt;
* Create an EvalExpression that checks whether the text input is null or empty, and if not, returns the desired expression EXP.&lt;br /&gt;
*  Add each EvalExpression (Name_FilterExpression, Desc_FilterExpression) to the 'main' one (FilterExpression) as Parameters, combined using the escaped '&amp;amp;&amp;amp;' concatenation symbols.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to the escaped syntax required in the Expression, &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;+&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+&amp;lt;/source&amp;gt; is the correct syntax required to concatenate filter expressions together.}}&lt;br /&gt;
&lt;br /&gt;
Once the additional input controls have been created, processed in their own EvalExpressions, referenced as EvalExpressionParameters and the &amp;quot;FilterExpression&amp;quot; EvalExpression has been adapted as shown, the filter should already function as required; the Collection Filters and Items Controls do not need to be adapted.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Input To Filter Multiple Properties ===&lt;br /&gt;
Since we have control over how the input is matched against the properties, is possible to use the same input to filter against multiple properties, for example, both Title and SubTitle. This keeps the UI lean with less elements to clutter the layout, and the user is not forced to think about which input relates to which field. The downside, of course, is that the search will be slightly less refined.&lt;br /&gt;
This is achieved easily as shown:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT &amp;quot; Value=&amp;quot;{Binding ElementName=Title_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding ElementName=SubTitle_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Title_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding Source={StaticResource SubTitle_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note the different operator required in this case. Unless your object has the same Title ''and'' SubTitle, there will be no match found unless the FilterExpression is amended to an Or relationship.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Combining Dynamic (User Inputs) and Static (Predefined) Criteria ==&lt;br /&gt;
A common use of the Collection Filter is to filter child lists based on one or multiple properties, such as MetaDefinition.UID or a certain status, to present groups of specific object types. Therefore, it is likely that a customizing may require hardcoded filter criteria, combined with user input, if any is provided.&lt;br /&gt;
&lt;br /&gt;
The following describes how to implement such a scenario in XAML, again using [[:Category:Multiple Dynamic (User Inputs) Criteria]] as a starting point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once one or multiple EvalExpressions have been added to process each input (such as Name_FilterExpression, Desc_FilterExpression), the remaining predefined filter criteria, in this example, filtering for a specific MetaClass by UID, can be added as an x:String, or directly in the EvalExpression paramerter, though the first approach is recommended, for better readability.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The above syntax only works for individual static string filters. If you need to chain multiple hardcoded filters, such as filtering in several UIDs, they need one String resource each, and must be added to the FilterExpression expression individually as in the below example.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple Static Criteria ===&lt;br /&gt;
Experimentation has shown that the dynamic filter struggles to combine a single string made of multiple expressions, with additional expressions via the FilterExpression. However, it is still possible to combine user inputs and multiple static criteria, simply by breaking up the static criteria into separate strings. &lt;br /&gt;
&lt;br /&gt;
Of course, when for example filtering various MetaDefinitions.UIDs, the '&amp;amp;amp;' (and) comparison condition is no longer appropriate, as there will never be matches for multiple of these UIDs that returns a true result. In these cases, the comparison condition needs to be set to '||' ([[HowTo:Implement_Custom_Filtering#.27Or.27_Operations|Or]]).&lt;br /&gt;
The below example shows the correct syntax.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
{{Hint|Note that the above strings make use of the .Equals() method, which is an alternate option to the more commonly seen &amp;lt;nowiki&amp;gt;'Item.Content.MetaDefinition.UID.ToString().ToLower()==...&amp;lt;/nowiki&amp;gt;'}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Property Types ==&lt;br /&gt;
&lt;br /&gt;
=== Filtering an INT / Double ===&lt;br /&gt;
Though the string comparison works mostly the same for a Int / Dbl, you additionally have to include a .ToString() method to the EXP EvalExpressionParameter of that property's individual EvalExpression for it to evaluate:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
ConverterParameter='Item.Values[&amp;amp;quot;INSTRUCTIONID&amp;amp;quot;].ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a Boolean (CheckBox) ===&lt;br /&gt;
To process a Boolean filter, the expression needs to be slightly amended, due to the different type of filter match criteria that is required.&lt;br /&gt;
&lt;br /&gt;
Note that the below implementation returns all items by default (ie. when the CheckBox is unchecked), and returns only True matches when the CheckBox is checked. This functionality is designed to align with string input, where no filtering occurs for each string until something is entered into the corresponding text input box.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Note that this example uses UWP xaml syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Bool_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==false) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;MP_BOOL&amp;amp;quot;]==&amp;amp;quot;{0}&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The individual EvalExpression for a Boolean filter match needs to be amended as follows:&lt;br /&gt;
** The INPUT can never be null, as the IsChecked property is either True or False. Therefore we can remove the Null or empty test, and instead, check whether the CheckBox is checked or not. IsChecked=False should 'escape' the expression, and return all items (or, not contribute to the overall filtering).&lt;br /&gt;
* The EvalExpressionParameter 'EXP' similarly can be simplified, as it does not need to make a string match with .Contains, but simply check whether the property value matches to True or False.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Changes only need to be made to the individual EvalExpression. The &amp;quot;FilterExpression&amp;quot; that joins all individual expressions does not need to be amended, other than the regular additional EvalExpressionParameter, and updating the expression accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a GUID Property ===&lt;br /&gt;
The expression string seen in the &amp;quot;EXP&amp;quot; command parameters shown above compare a user input with the value stored in Values[MP_PROPERTY], of the requested property. However, in certain cases, it may not be adequate to search in Values[MP_PROPERTY], such as when the property is a GUID. This is because Values[LK_GUID_PROPERTY] returns the UID value of the linked object, whereas Properties.VisibleItems[LK_GUID_PROPERTY].DisplayValue returns the human readable label associated with this linked object. &lt;br /&gt;
&lt;br /&gt;
The solution is to rewrite the expression string to target the correct binding:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good way to inspect and test the target binding is to output it on the items UI, therefore on the ItemTemplate of your ListView, as well as to output the expressions that are being dynamically generated in your EvalExpressions, by binding the Result to the Text property of a &amp;lt;TextBlock&amp;gt; (UWP) or &amp;lt;Label&amp;gt; (Xamarin).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Filtering a DateTime Property ===&lt;br /&gt;
Filtering a DateTime property is more complex than other properties, because one has to consider both the input, and the type of filtering. &lt;br /&gt;
&lt;br /&gt;
Input can be done both as freetext, and using a DatePicker. Freetext input has the downside that users have to take care to enter the correct string format (ie. yyyy/MM/dd), whereas the DatePicker outputs a DateTime string which can then be formatted for use in the EvalExpression. The DatePicker does however have certain downsides, chief of which being that it is not nullable, the current date is shown when no date has been selected, making the non-filtered UI indistinguishable from the filtered one.&lt;br /&gt;
&lt;br /&gt;
Filtering can be done as a simple comparison, such as finding an object whose date matches the inputted date. However, it is also possible to ranges; either 'open', that is, dates before or after the user's selection, or 'closed', which is a date falling inside a range created by two user inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Input ====&lt;br /&gt;
The input method is the first important consideration for filtering DateTime properties. A DatePicker is the generally accepted method. Textbox input is also possible, though users will need to correctly format their input to 'yyyy/MM/dd' (such as &amp;quot;2032/12/31&amp;quot;) in order to achieve a valid comparison.&lt;br /&gt;
&lt;br /&gt;
'''DatePicker'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DatePicker&amp;quot; Tag=&amp;quot;{Binding SelectedDate, ElementName=DatePicker, Converter={StaticResource StringFormatConverter}, ConverterParameter='{0:yyyy/MM/dd}'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DateInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;Label x:Name=&amp;quot;DateString&amp;quot; Text=&amp;quot;{Binding Path=Date, Source={x:Reference DateInput}, StringFormat='{0:yyyy/MM/dd}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|In both cases, it is necessary that the format of the input matches the format of the property value, which will be explained more in the Comparison section below. In the above examples, this is applied in the Tag property (UWP) or through use of a secondary control (a Label in the Xamarin example).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Freetext'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;DateInput&amp;quot; PlaceholderText=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;DateInput&amp;quot; Placeholder=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Remember that no matches will be found unless the date is inputted following a 'yyyy/MM/dd' format.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For greater control over the input format, it is also possible to provide multiple TextBoxes, which could then either be concatenated in an EvalExpression, or used to filter by the DateTime.Day/Week/Month values of the property individually, if such functionality fits the usecase.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Comparison ====&lt;br /&gt;
Since the EvalExpression approach utilizes string comparisons, not only is it necessary to format the input string, but the property value must also be formatted to match. The 'yyyy/MM/dd' format includes several measures to create the best conditions for comparing the two strings; &lt;br /&gt;
* months and days below the value of 10 cannot be a single digit, but must be padded with a preceding 0 in order to keep the string lengths equivalent; 2032/1/1 cannot be property compared with 2032/12/31 for example, as the strings are different lengths.&lt;br /&gt;
* putting the year and month first also improves the chance of a correct comparison, as a day 01 can be after a day 31 if the month and year are greater.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|For the rest of this section, a DatePicker input is assumed.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Single'''&lt;br /&gt;
&lt;br /&gt;
Comparison of a single date against a property value works the same way as other dynamic filters. Therefore it is sufficient to make use of the previously used .Contains() or .Equals() methods. &lt;br /&gt;
Remember that the Date attribute is not directly usable from the DatePicker, and its formatted version received via the Tag attribute or an additional label is what is actually used by the EvalExpressions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Range'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It is also possible to filter not for a specific date, but rather for all items whose property falls after or before the user input (depending on whether a  'Starting From' or 'Ending By' comparison is implemented. An 'open' range filter is created when only one value is inputted by the user, whereas a 'closed' range has a start and end date, and must fall on or in between these two.&lt;br /&gt;
&lt;br /&gt;
For range comparison, we use the  [https://learn.microsoft.com/en-us/dotnet/api/system.string.compareto?view=net-9.0 Microsoft .CompareTo method]. As documented there, this method outputs a -1/0/1 depending on the compared string's location in the range. Our expression can target one output for an 'exclusive' filter (in which the inputted date is not considered for the range), however, a more likely scenario is that the user wants the inputted date included in the filter. This is why the expression in the StringFormatConverter should be defined for start date as !=-1, and for end date as !=1; the instance should be not less than than the start date (where true would be an output of 0 or 1), and not greater than the end date (true = -1 or 0), respectively.&lt;br /&gt;
&lt;br /&gt;
Similar to the earlier section on [[HowTo:Implement_Custom_Filtering#Multiple_Dynamic_.28User_Inputs.29_Criteria|multiple inputs]], separate EvalExpressions are used for each half of the range, meaning that the filtering also works (as an 'open Range' filter) when only one value is inputted by the user. To implement only an open range filter, simply eliminate the second input and EvalExpression.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Start_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;End_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding ElementName=Start_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding ElementName=End_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Start_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;End_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Start_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding Source={StaticResource End_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note the .CompareTo method used in each half of the ranged filter expression; the start date comparison is &amp;lt;noWiki&amp;gt;!=-1&amp;lt;/noWiki&amp;gt;, whereas the end date comparison &amp;lt;noWiki&amp;gt;!=1&amp;lt;/noWiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Individual DateTime Components ====&lt;br /&gt;
The DateTime property has the additional benefit of exposing components that can be used to refine filtering.&lt;br /&gt;
&lt;br /&gt;
[[Developer_Mode]] reveals the members available under the binding path; &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;PropertyItems[&amp;quot;DATETIME&amp;quot;].Value&amp;lt;/source&amp;gt;&lt;br /&gt;
These include; Date, Day, DayOfWeek, DayOfYear, Hour, Millisecond, Minute, Month, Ticks, TimeOfDay, and Year.&lt;br /&gt;
&lt;br /&gt;
These can be used in the EvalExpressionParameter as a binding in the custom expression string, as follows, and can even be used in separate filters to search individual components of the date seperately (for example, to filter by a particular month, year, or even day of the week).&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DateInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DayWeekInputString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Adjustments ==&lt;br /&gt;
=== 'Or' Operations ===&lt;br /&gt;
All examples of multiple inputs in this article use an 'and' filter condition, where, if any inputs are entered, only items that match all inputs (NAME &amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt; DESC) are kept in the collection, to produce a 'filtering down' effect in the user interface.&lt;br /&gt;
&lt;br /&gt;
If a less strict filter condition is required, the FilterExpression can be altered to have an 'or' condition, where all results that match NAME &amp;lt;b&amp;gt;or&amp;lt;/b&amp;gt; DESC, but not necessarily both, are shown. To do so, simply change the concatenation syntax to return 'or' symbols (two pipes or '||'):&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;amp;quot;||&amp;amp;quot;+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Displaying a Count ==&lt;br /&gt;
To display the filtered count, use the following syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding Path=Count, Source={StaticResource FilterView}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persisting Filter Values ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
One of the drawbacks of this method of filtering is the inability for the UI to 'remember' user inputs when they navigate away from the page. This is because this implementation of dynamic filters exists solely on the UI thread (that is, is defined in XAML only with no actual connection to the data, opposite to [[Property_Based_Content_Filters]], for example), which is re-rendered according to the xaml definition every time the page is loaded. This section describes how to implement a limited solution to this issue, the limitation being that values can currently only be persisted during the 'session', and are lost when the user closes the client.&lt;br /&gt;
&lt;br /&gt;
This solution involves use of the StoreProfileParameterCommand to create key-value pairs (a simple list of items made up of a name and a value), which can then be read using the 'StoredProfileParameters[key]'. The StoreProfileParameterCommand accepts a CommandParameter with the format 'key=value', where 'key' represents the name of the key-value pair that can be used to reference it later (in the case below, &amp;quot;name&amp;quot;), and 'value' represents what string should be returned by referencing it (in this case, the Text attribute of the text field control).&lt;br /&gt;
&lt;br /&gt;
When a user completes their input, we use the StoreProfileParameterCommand to create or update a key-value pair associated with a particular filter, instead of passively reading the value from the input as was done previously. &lt;br /&gt;
&lt;br /&gt;
Furthermore, the associated StoredProfileParameter is fed back to the input control so that if any value is set for that particular key (ie. if a filter value has been created), it will be displayed on the input control. Otherwise, the input control will be reset when next loading the page, as was previously the case with dynamic filtering, whereas the StoredProfileParameter will be persisted, leading to a mismatch between the UI and filtering state.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:EventTriggerBehavior EventName=&amp;quot;LostFocus&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;core:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Text, ElementName=NameInput, Converter={StaticResource StringFormatConverter}, ConverterParameter='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/TextBox&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pay attention to which [https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.textbox?view=winrt-26100#events Event] is used to trigger the StoreProfileParameterCommand. The above example uses LostFocus, which fires when the user clicks out of the TextBox. Another possible choice is TextChanged, however, this means that the command will fire with every keystroke, which may reduce overall performance.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Entry.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Completed&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference NameInput}, StringFormat='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry.Behaviors&amp;gt;				&lt;br /&gt;
&amp;lt;/Entry&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Xamarin 'Completed' event fires when the user clicks the return button on their onscreen keyboard.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
{{Hint|StringFormatConverter/StringFormat is used to format the key-value pair as required by the StoreProfileParameterCommand. The key is hardcoded into the formatted string as, for example &amp;lt;noWiki&amp;gt;'name={0}'&amp;lt;/noWiki&amp;gt;. The dynamic value, in this case whatever is inputted in the text field when the edit is completed, replaces the &amp;lt;noWiki&amp;gt;{0}&amp;lt;/noWiki&amp;gt; tag when the binding is evaluated (ie. when the command is executed).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this implementation, the EvalExpression also needs to be adapted to check whether a particular filter value exists within the StoredProfileParameters list, instead of simply whether the associated input control has a value or selection:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note how the EvalExpressionParameters have been adapted to reference a StoredProfileParameter, rather than the input control.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Item Selection ===&lt;br /&gt;
Filter value persistence works also when the user input method is to select an item from a picker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:PickerExt&lt;br /&gt;
    x:Name=&amp;quot;ExamplePicker&amp;quot;&lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Children.Items[0].PropertyItems[PROPERTY].MetaProperty.SelectiveList, Converter={StaticResource SelectiveListToItems}, TargetNullValue='', FallbackValue=''}&amp;quot;&lt;br /&gt;
    ItemDisplayBinding=&amp;quot;{Binding DisplayText}&amp;quot;&lt;br /&gt;
    SelectedValuePath=&amp;quot;Value&amp;quot;&lt;br /&gt;
    SelectedValue=&amp;quot;{Binding StoredProfileParameters[key]}&amp;quot;&lt;br /&gt;
    SelectionChangedCommand=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot;&lt;br /&gt;
    SelectionChangedCommandParameter=&amp;quot;{Binding SelectedItem.Value, Source={x:Reference ExamplePicker}, StringFormat='key={0}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Text Input in ListView Header Template ===&lt;br /&gt;
This implementation will not work when parts of it, such as the Input fields, are hosted in a ListView header or footer template, as this content is not readable by the rest of the page and will return a &amp;quot;Can not find the object referenced&amp;quot; parsing error.&lt;br /&gt;
&lt;br /&gt;
To workaround this, you need to move the Input control out of the header template.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
* Everything looks correct but filtering returns no results:&lt;br /&gt;
** Ensure that the string you are trying to filter by matches what is returned as the DisplayValue.&lt;br /&gt;
** If the property is a INT / DBL (Integer or Double) type: The string comparison doesn't work directly with non-string types. Check the [[HowTo:Implement_Custom_Filtering#Other_Property_Types|Other Property Types]] section.&lt;br /&gt;
** If filtering a DateTime property, ensure the formatting of the input matches that of the property value in the EXP string.&lt;br /&gt;
** If filtering a GUID property, ensure the same values are compared; DisplayString if the user is inputting readable text, UID if the user has selected an item from a list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[XAML]]&lt;br /&gt;
* [[XAML_Tips]]&lt;br /&gt;
* [[Xamarin_XAML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28442</id>
		<title>HowTo:Implement Custom Filtering</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28442"/>
				<updated>2025-07-30T13:36:11Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Comparison */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to customize filtered lists that accept one or multiple user inputs as filter criteria (referred to as 'Dynamic'), alone or combined with predefined criteria(referred to as 'Static'). The following examples are based on the Children.Items collection, however, Properties or Documents can be filtered too, by adjusting the ItemsSource in the &amp;lt;cv:ListCollectionView&amp;gt; or &amp;lt;controls:SfDataSourceExt&amp;gt; in UWP or Xamarin respectively. &lt;br /&gt;
&lt;br /&gt;
{{Attention|Are you sure you need this?&amp;lt;br&amp;gt;UBIK has a simpler out-of-the-box Property-based filtering technique for filtering child objects when one or multiple property value inputs are the only type of criteria required. See [[Property_Based_Content_Filters]]}}&lt;br /&gt;
&lt;br /&gt;
Four elements are required for Custom Filtering:&lt;br /&gt;
* Input field - for user inputs.&lt;br /&gt;
* [[EvalExpression]] - for converting user inputs into a filter expression.&lt;br /&gt;
* Collection Filter - for applying the expression to a collection.&lt;br /&gt;
* Items control - for displaying the filtered items.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This system acts dynamically to output the filtered list, without requiring the use of an Evaluation button, and directly outputs all items that match the filter input.&lt;br /&gt;
&lt;br /&gt;
This page will first describe the basic implementation of a single dynamic input, then describe how to allow for multiple inputs, and finally, how to combine multiple dynamic inputs with static, predefined criteria.&lt;br /&gt;
However, keep in mind that for simply dynamically filtering child objects based on single or multiple property values, this complex customizing is not required. Instead, this technique gives the possibility to create multiple collections based on the same child collection, each with individual filters that do not interfere with each other, or else to create filters based on dynamic inputs for Properties or Documents, which are not handled by the Content-Based Filtering functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Basic Implementation ==&lt;br /&gt;
To build the filter in XAML, you will need to place an EvalExpression and a Collection Filter in the Resources of your container (most likely, a Grid). In the container's content, you will need the Input control, and the items control as an output (most likely a ListView).&lt;br /&gt;
&lt;br /&gt;
The following namespaces are used:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
For UWP, it is possible to place the EvalExpression and Collection Filter into the &amp;lt;Grid.Resources&amp;gt;, as shown below. However, for Xamarin, it is required to use the &amp;lt;ContentView.Resources&amp;gt;.&lt;br /&gt;
For the Collection Filter, use [[XAML_Changes_in_UBIK_WinX_3.5#Filtering_by_expressions|ListCollectionView]] for UWP &amp;amp; [[Xamarin_XAML#FeatureRelated|Content_filtering]] for Xamarin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
	&amp;lt;cv:ListCollectionView&lt;br /&gt;
		x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
		Expression=&amp;quot;{Binding ElementName=FilterExpression, Path=Result}&amp;quot;&lt;br /&gt;
		ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note that the EvalExpression in UWP requires an x:Name, which in turn requires the 'ElementName' syntax seen in the &amp;lt;cv:ListCollectionView&amp;gt;.}}&lt;br /&gt;
{{Attention|Note that the Converter seen in the 'EXP' EvalExpressionParameter in UWP is 'StringFormatConverter', which is different than in Xamarin.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
		&amp;lt;controls:SfDataSourceExt &lt;br /&gt;
			x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
			Expression=&amp;quot;{Binding Source={StaticResource FilterExpression}, Path=Result}&amp;quot;&lt;br /&gt;
			ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; &lt;br /&gt;
                         Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|Note that Unloaded attribute improves performance by preventing refiltering while navigating away from the page. This attribute should be added to all instances of controls:SfDataSourceExt in your customizing.}}&lt;br /&gt;
{{Hint|Note that the EvalExpression in Xamarin requires an x:Key, which in turn requires the 'StaticResource ' syntax seen in the &amp;lt;controls:SfDataSourceExt&amp;gt;.}}&lt;br /&gt;
{{Hint|Note that the Converter seen in the 'EXP' EvalExpressionParameter in Xamarin is 'StringFormat', which is different than in UWP.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The EvalExpression Expression first checks whether the TextBox input is empty (as this would otherwise incorrectly be considered a filter input, whereby the property should be empty) and if so returns the unfiltered list (expression outcome hardcoded to 'true'), otherwise, applies the filter (expression outcome is taken from string constructed in ConverterParameter of 'EXP').&lt;br /&gt;
&lt;br /&gt;
There are two important details of the EvalExpressionParameter to note here: &lt;br /&gt;
* The &amp;quot;ElementName=NameInput&amp;quot; / &amp;quot;x:Reference NameInput&amp;quot; should match exactly to the name of your Input control.&lt;br /&gt;
* The Item.Values[&amp;amp;quot;NAME&amp;amp;quot;] should be adapted, by changing NAME to the property that should be filtered by this input.&lt;br /&gt;
&lt;br /&gt;
=== TextBox / Entry ===&lt;br /&gt;
The input field is just a basic &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt; we will use to input the filter criteria value. The only important detail for this input control is the name, which must be passed back to the EvalExpressionParameter.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It will look like this:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Items control  ===&lt;br /&gt;
An items control will likely be used for displaying filtered results, such as &amp;lt;controls:SelectionBoundListView&amp;gt; for UWP &amp;amp; [[Xamarin_XAML#Performance|SfListViewExt]] for Xamarin:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SelectionBoundListView&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryList&amp;quot;     &lt;br /&gt;
       ItemsSource=&amp;quot;{StaticResource FilterView}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
       ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilterView}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multiple Dynamic (User Inputs) Criteria ==&lt;br /&gt;
It is likely that the customizing is required to process multiple user inputs for the same filter. In this case, the EvalExpression must be adapted to combine the inputs (most likely using an AND relation, for a 'filtering-down' effect), as well as to deliver the full list when nothing is inputted.&lt;br /&gt;
A &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt;, and an EvalExpression, will be required for every additional property, as well as a final EvalExpression to combine them.&lt;br /&gt;
&lt;br /&gt;
The EvalExpressions should be amended as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows how to check for inputs to either property, NAME and DESCR, then use an additional EvalExpression to create the expression string that combines them. For each additional property you need to:&lt;br /&gt;
* Create an EvalExpression that checks whether the text input is null or empty, and if not, returns the desired expression EXP.&lt;br /&gt;
*  Add each EvalExpression (Name_FilterExpression, Desc_FilterExpression) to the 'main' one (FilterExpression) as Parameters, combined using the escaped '&amp;amp;&amp;amp;' concatenation symbols.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to the escaped syntax required in the Expression, &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;+&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+&amp;lt;/source&amp;gt; is the correct syntax required to concatenate filter expressions together.}}&lt;br /&gt;
&lt;br /&gt;
Once the additional input controls have been created, processed in their own EvalExpressions, referenced as EvalExpressionParameters and the &amp;quot;FilterExpression&amp;quot; EvalExpression has been adapted as shown, the filter should already function as required; the Collection Filters and Items Controls do not need to be adapted.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Input To Filter Multiple Properties ===&lt;br /&gt;
Since we have control over how the input is matched against the properties, is possible to use the same input to filter against multiple properties, for example, both Title and SubTitle. This keeps the UI lean with less elements to clutter the layout, and the user is not forced to think about which input relates to which field. The downside, of course, is that the search will be slightly less refined.&lt;br /&gt;
This is achieved easily as shown:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT &amp;quot; Value=&amp;quot;{Binding ElementName=Title_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding ElementName=SubTitle_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Title_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding Source={StaticResource SubTitle_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note the different operator required in this case. Unless your object has the same Title ''and'' SubTitle, there will be no match found unless the FilterExpression is amended to an Or relationship.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Combining Dynamic (User Inputs) and Static (Predefined) Criteria ==&lt;br /&gt;
A common use of the Collection Filter is to filter child lists based on one or multiple properties, such as MetaDefinition.UID or a certain status, to present groups of specific object types. Therefore, it is likely that a customizing may require hardcoded filter criteria, combined with user input, if any is provided.&lt;br /&gt;
&lt;br /&gt;
The following describes how to implement such a scenario in XAML, again using [[:Category:Multiple Dynamic (User Inputs) Criteria]] as a starting point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once one or multiple EvalExpressions have been added to process each input (such as Name_FilterExpression, Desc_FilterExpression), the remaining predefined filter criteria, in this example, filtering for a specific MetaClass by UID, can be added as an x:String, or directly in the EvalExpression paramerter, though the first approach is recommended, for better readability.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The above syntax only works for individual static string filters. If you need to chain multiple hardcoded filters, such as filtering in several UIDs, they need one String resource each, and must be added to the FilterExpression expression individually as in the below example.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple Static Criteria ===&lt;br /&gt;
Experimentation has shown that the dynamic filter struggles to combine a single string made of multiple expressions, with additional expressions via the FilterExpression. However, it is still possible to combine user inputs and multiple static criteria, simply by breaking up the static criteria into separate strings. &lt;br /&gt;
&lt;br /&gt;
Of course, when for example filtering various MetaDefinitions.UIDs, the '&amp;amp;amp;' (and) comparison condition is no longer appropriate, as there will never be matches for multiple of these UIDs that returns a true result. In these cases, the comparison condition needs to be set to '||' ([[HowTo:Implement_Custom_Filtering#.27Or.27_Operations|Or]]).&lt;br /&gt;
The below example shows the correct syntax.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
{{Hint|Note that the above strings make use of the .Equals() method, which is an alternate option to the more commonly seen &amp;lt;nowiki&amp;gt;'Item.Content.MetaDefinition.UID.ToString().ToLower()==...&amp;lt;/nowiki&amp;gt;'}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Property Types ==&lt;br /&gt;
&lt;br /&gt;
=== Filtering an INT / Double ===&lt;br /&gt;
Though the string comparison works mostly the same for a Int / Dbl, you additionally have to include a .ToString() method to the EXP EvalExpressionParameter of that property's individual EvalExpression for it to evaluate:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
ConverterParameter='Item.Values[&amp;amp;quot;INSTRUCTIONID&amp;amp;quot;].ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a Boolean (CheckBox) ===&lt;br /&gt;
To process a Boolean filter, the expression needs to be slightly amended, due to the different type of filter match criteria that is required.&lt;br /&gt;
&lt;br /&gt;
Note that the below implementation returns all items by default (ie. when the CheckBox is unchecked), and returns only True matches when the CheckBox is checked. This functionality is designed to align with string input, where no filtering occurs for each string until something is entered into the corresponding text input box.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Note that this example uses UWP xaml syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Bool_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==false) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;MP_BOOL&amp;amp;quot;]==&amp;amp;quot;{0}&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The individual EvalExpression for a Boolean filter match needs to be amended as follows:&lt;br /&gt;
** The INPUT can never be null, as the IsChecked property is either True or False. Therefore we can remove the Null or empty test, and instead, check whether the CheckBox is checked or not. IsChecked=False should 'escape' the expression, and return all items (or, not contribute to the overall filtering).&lt;br /&gt;
* The EvalExpressionParameter 'EXP' similarly can be simplified, as it does not need to make a string match with .Contains, but simply check whether the property value matches to True or False.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Changes only need to be made to the individual EvalExpression. The &amp;quot;FilterExpression&amp;quot; that joins all individual expressions does not need to be amended, other than the regular additional EvalExpressionParameter, and updating the expression accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a GUID Property ===&lt;br /&gt;
The expression string seen in the &amp;quot;EXP&amp;quot; command parameters shown above compare a user input with the value stored in Values[MP_PROPERTY], of the requested property. However, in certain cases, it may not be adequate to search in Values[MP_PROPERTY], such as when the property is a GUID. This is because Values[LK_GUID_PROPERTY] returns the UID value of the linked object, whereas Properties.VisibleItems[LK_GUID_PROPERTY].DisplayValue returns the human readable label associated with this linked object. &lt;br /&gt;
&lt;br /&gt;
The solution is to rewrite the expression string to target the correct binding:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good way to inspect and test the target binding is to output it on the items UI, therefore on the ItemTemplate of your ListView, as well as to output the expressions that are being dynamically generated in your EvalExpressions, by binding the Result to the Text property of a &amp;lt;TextBlock&amp;gt; (UWP) or &amp;lt;Label&amp;gt; (Xamarin).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Filtering a DateTime Property ===&lt;br /&gt;
Filtering a DateTime property is more complex than other properties, because one has to consider both the input, and the type of filtering. &lt;br /&gt;
&lt;br /&gt;
Input can be done both as freetext, and using a DatePicker. Freetext input has the downside that users have to take care to enter the correct string format (ie. yyyy/MM/dd), whereas the DatePicker outputs a DateTime string which can then be formatted for use in the EvalExpression. The DatePicker does however have certain downsides, chief of which being that it is not nullable, the current date is shown when no date has been selected, making the non-filtered UI indistinguishable from the filtered one.&lt;br /&gt;
&lt;br /&gt;
Filtering can be done as a simple comparison, such as finding an object whose date matches the inputted date. However, it is also possible to ranges; either 'open', that is, dates before or after the user's selection, or 'closed', which is a date falling inside a range created by two user inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Input ====&lt;br /&gt;
The input method is the first important consideration for filtering DateTime properties. A DatePicker is the generally accepted method. Textbox input is also possible, though users will need to correctly format their input to 'yyyy/MM/dd' (such as &amp;quot;2032/12/31&amp;quot;) in order to achieve a valid comparison.&lt;br /&gt;
&lt;br /&gt;
'''DatePicker'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DatePicker&amp;quot; Tag=&amp;quot;{Binding SelectedDate, ElementName=DatePicker, Converter={StaticResource StringFormatConverter}, ConverterParameter='{0:yyyy/MM/dd}'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DateInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;Label x:Name=&amp;quot;DateString&amp;quot; Text=&amp;quot;{Binding Path=Date, Source={x:Reference DateInput}, StringFormat='{0:yyyy/MM/dd}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|In both cases, it is necessary that the format of the input matches the format of the property value, which will be explained more in the Comparison section below. In the above examples, this is applied in the Tag property (UWP) or through use of a secondary control (a Label in the Xamarin example).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Freetext'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;DateInput&amp;quot; PlaceholderText=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;DateInput&amp;quot; Placeholder=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Remember that no matches will be found unless the date is inputted following a 'yyyy/MM/dd' format.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For greater control over the input format, it is also possible to provide multiple TextBoxes, which could then either be concatenated in an EvalExpression, or used to filter by the DateTime.Day/Week/Month values of the property individually, if such functionality fits the usecase.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Comparison ====&lt;br /&gt;
Since the EvalExpression approach utilizes string comparisons, not only is it necessary to format the input string, but the property value must also be formatted to match. The 'yyyy/MM/dd' format includes several measures to create the best conditions for comparing the two strings; &lt;br /&gt;
* months and days below the value of 10 cannot be a single digit, but must be padded with a preceding 0 in order to keep the string lengths equivalent; 2032/1/1 cannot be property compared with 2032/12/31 for example, as the strings are different lengths.&lt;br /&gt;
* putting the year and month first also improves the chance of a correct comparison, as a day 01 can be after a day 31 if the month and year are greater.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|For the rest of this section, a DatePicker input is assumed.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Single'''&lt;br /&gt;
&lt;br /&gt;
Comparison of a single date against a property value works the same way as other dynamic filters. Therefore it is sufficient to make use of the previously used .Contains() or .Equals() methods. &lt;br /&gt;
Remember that the Date attribute is not directly usable from the DatePicker, and it's formatted version received via the Tag attribute or an additional label is what is actually used by the EvalExpressions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Range'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It is also possible to filter not for a specific date, but rather for all items whose property falls after or before the user input (depending on whether a  'Starting From' or 'Ending By' comparison is implemented. An 'open' range filter is created when only one value is inputted by the user, whereas a 'closed' range has a start and end date, and must fall on or in between these two.&lt;br /&gt;
&lt;br /&gt;
For range comparison, we use the  [https://learn.microsoft.com/en-us/dotnet/api/system.string.compareto?view=net-9.0 Microsoft .CompareTo method]. As documented there, this method outputs a -1/0/1 depending on the compared string's location in the range. Our expression can target one output for an 'exclusive' filter (in which the inputted date is not considered for the range), however, a more likely scenario is that the user wants the inputted date included in the filter. This is why the expression in the StringFormatConverter should be defined for start date as !=-1, and for end date as !=1; the instance should be not less than than the start date (where true would be an output of 0 or 1), and not greater than the end date (true = -1 or 0), respectively.&lt;br /&gt;
&lt;br /&gt;
Similar to the earlier section on [[HowTo:Implement_Custom_Filtering#Multiple_Dynamic_.28User_Inputs.29_Criteria|multiple inputs]], separate EvalExpressions are used for each half of the range, meaning that the filtering also works (as an 'open Range' filter) when only one value is inputted by the user. To implement only an open range filter, simply eliminate the second input and EvalExpression.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Start_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;End_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding ElementName=Start_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding ElementName=End_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Start_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;End_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Start_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding Source={StaticResource End_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note the .CompareTo method used in each half of the ranged filter expression; the start date comparison is &amp;lt;noWiki&amp;gt;!=-1&amp;lt;/noWiki&amp;gt;, whereas the end date comparison &amp;lt;noWiki&amp;gt;!=1&amp;lt;/noWiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Individual DateTime Components ====&lt;br /&gt;
The DateTime property has the additional benefit of exposing components that can be used to refine filtering.&lt;br /&gt;
&lt;br /&gt;
[[Developer_Mode]] reveals the members available under the binding path; &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;PropertyItems[&amp;quot;DATETIME&amp;quot;].Value&amp;lt;/source&amp;gt;&lt;br /&gt;
These include; Date, Day, DayOfWeek, DayOfYear, Hour, Millisecond, Minute, Month, Ticks, TimeOfDay, and Year.&lt;br /&gt;
&lt;br /&gt;
These can be used in the EvalExpressionParameter as a binding in the custom expression string, as follows, and can even be used in separate filters to search individual components of the date seperately (for example, to filter by a particular month, year, or even day of the week).&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DateInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DayWeekInputString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Adjustments ==&lt;br /&gt;
=== 'Or' Operations ===&lt;br /&gt;
All examples of multiple inputs in this article use an 'and' filter condition, where, if any inputs are entered, only items that match all inputs (NAME &amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt; DESC) are kept in the collection, to produce a 'filtering down' effect in the user interface.&lt;br /&gt;
&lt;br /&gt;
If a less strict filter condition is required, the FilterExpression can be altered to have an 'or' condition, where all results that match NAME &amp;lt;b&amp;gt;or&amp;lt;/b&amp;gt; DESC, but not necessarily both, are shown. To do so, simply change the concatenation syntax to return 'or' symbols (two pipes or '||'):&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;amp;quot;||&amp;amp;quot;+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Displaying a Count ==&lt;br /&gt;
To display the filtered count, use the following syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding Path=Count, Source={StaticResource FilterView}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persisting Filter Values ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
One of the drawbacks of this method of filtering is the inability for the UI to 'remember' user inputs when they navigate away from the page. This is because this implementation of dynamic filters exists solely on the UI thread (that is, is defined in XAML only with no actual connection to the data, opposite to [[Property_Based_Content_Filters]], for example), which is re-rendered according to the xaml definition every time the page is loaded. This section describes how to implement a limited solution to this issue, the limitation being that values can currently only be persisted during the 'session', and are lost when the user closes the client.&lt;br /&gt;
&lt;br /&gt;
This solution involves use of the StoreProfileParametersCommand to create key-value pairs (a simple list of items made up of a name and a value), which can then be read using the 'StoredProfileParameters[key]'. The StoreProfileParameterCommand accepts a CommandParameter with the format 'key=value', where 'key' represents the name of the key-value pair that can be used to reference it later (in the case below, &amp;quot;name&amp;quot;), and 'value' represents what string should be returned by referencing it (in this case, the Text attribute of the text field control).&lt;br /&gt;
&lt;br /&gt;
When a user completes their input, we use the StoreProfileParametersCommand to create or update a key-value pair associated with a particular filter, instead of passively reading the value from the input as was done previously. &lt;br /&gt;
&lt;br /&gt;
Furthermore, the associated StoredProfileParameter is fed back to the input control so that if any value is set for that particular key (ie. if a filter value has been created), it will be displayed on the input control. Otherwise, the input control will be reset when next loading the page, as was previously the case with dynamic filtering, whereas the StoredProfileParameter will be persisted, leading to a mismatch between the UI and filtering state.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameter[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:EventTriggerBehavior EventName=&amp;quot;LostFocus&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;core:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Text, ElementName=NameInput, Converter={StaticResource StringFormatConverter}, ConverterParameter='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/TextBox&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pay attention to which [https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.textbox?view=winrt-26100#events Event] is used to trigger the StoreProfileParameterCommand. The above example uses LostFocus, which fires when the user clicks out of the TextBox. Another possible choice is TextChanged, however, this means that the command will fire with every keystroke, which may reduce overall performance.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Entry.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Completed&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference NameInput}, StringFormat='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry.Behaviors&amp;gt;				&lt;br /&gt;
&amp;lt;/Entry&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Xamarin 'Completed' event fires when the user clicks the return button on their onscreen keyboard.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
{{Hint|StringFormatConverter/StringFormat is used to format the key-value pair as required by the StoreProfileParameterCommand. The key is hardcoded into the formatted string as, for example &amp;lt;noWiki&amp;gt;'name={0}'&amp;lt;/noWiki&amp;gt;. The dynamic value, in this case whatever is inputted in the text field when the edit is completed, replaces the &amp;lt;noWiki&amp;gt;{0}&amp;lt;/noWiki&amp;gt; tag when the binding is evaluated (ie. when the command is executed).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this implementation, the EvalExpression also needs to be adapted to check whether a particular filter value exists within the StoredProfileParameters list, instead of simply whether the associated input control has a value or selection:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note how the EvalExpressionParameters have been adapted to reference a StoredProfileParameter, rather than the input control.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Item Selection ===&lt;br /&gt;
Filter value persistence works also when the user input method is to select an item from a picker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:PickerExt&lt;br /&gt;
    x:Name=&amp;quot;ExamplePicker&amp;quot;&lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Children.Items[0].PropertyItems[PROPERTY].MetaProperty.SelectiveList, Converter={StaticResource SelectiveListToItems}, TargetNullValue='', FallbackValue=''}&amp;quot;&lt;br /&gt;
    ItemDisplayBinding=&amp;quot;{Binding DisplayText}&amp;quot;&lt;br /&gt;
    SelectedValuePath=&amp;quot;Value&amp;quot;&lt;br /&gt;
    SelectedValue=&amp;quot;{Binding StoredProfileParameters[key]}&amp;quot;&lt;br /&gt;
    SelectionChangedCommand=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot;&lt;br /&gt;
    SelectionChangedCommandParameter=&amp;quot;{Binding SelectedItem.Value, Source={x:Reference ExamplePicker}, StringFormat='key={0}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Text Input in ListView Header Template ===&lt;br /&gt;
This implementation will not work when parts of it, such as the Input fields, are hosted in a ListView header or footer template, as this content is not readable by the rest of the page and will return a &amp;quot;Can not find the object referenced&amp;quot; parsing error.&lt;br /&gt;
&lt;br /&gt;
To workaround this, you need to move the Input control out of the header template.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
* Everything looks correct but filtering returns no results:&lt;br /&gt;
** Ensure that the string you are trying to filter by matches what is returned as the DisplayValue.&lt;br /&gt;
** If the property is a INT / DBL (Integer or Double) type: The string comparison doesn't work directly with non-string types. Check the [[HowTo:Implement_Custom_Filtering#Other_Property_Types|Other Property Types]] section.&lt;br /&gt;
** If filtering a DateTime property, ensure the formatting of the input matches that of the property value in the EXP string.&lt;br /&gt;
** If filtering a GUID property, ensure the same values are compared; DisplayString if the user is inputting readable text, UID if the user has selected an item from a list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[XAML]]&lt;br /&gt;
* [[XAML_Tips]]&lt;br /&gt;
* [[Xamarin_XAML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	<entry>
		<id>https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28441</id>
		<title>HowTo:Implement Custom Filtering</title>
		<link rel="alternate" type="text/html" href="https://wikitest.augmensys.com/index.php?title=HowTo:Implement_Custom_Filtering&amp;diff=28441"/>
				<updated>2025-07-30T13:34:20Z</updated>
		
		<summary type="html">&lt;p&gt;REP: /* Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to customize filtered lists that accept one or multiple user inputs as filter criteria (referred to as 'Dynamic'), alone or combined with predefined criteria(referred to as 'Static'). The following examples are based on the Children.Items collection, however, Properties or Documents can be filtered too, by adjusting the ItemsSource in the &amp;lt;cv:ListCollectionView&amp;gt; or &amp;lt;controls:SfDataSourceExt&amp;gt; in UWP or Xamarin respectively. &lt;br /&gt;
&lt;br /&gt;
{{Attention|Are you sure you need this?&amp;lt;br&amp;gt;UBIK has a simpler out-of-the-box Property-based filtering technique for filtering child objects when one or multiple property value inputs are the only type of criteria required. See [[Property_Based_Content_Filters]]}}&lt;br /&gt;
&lt;br /&gt;
Four elements are required for Custom Filtering:&lt;br /&gt;
* Input field - for user inputs.&lt;br /&gt;
* [[EvalExpression]] - for converting user inputs into a filter expression.&lt;br /&gt;
* Collection Filter - for applying the expression to a collection.&lt;br /&gt;
* Items control - for displaying the filtered items.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This system acts dynamically to output the filtered list, without requiring the use of an Evaluation button, and directly outputs all items that match the filter input.&lt;br /&gt;
&lt;br /&gt;
This page will first describe the basic implementation of a single dynamic input, then describe how to allow for multiple inputs, and finally, how to combine multiple dynamic inputs with static, predefined criteria.&lt;br /&gt;
However, keep in mind that for simply dynamically filtering child objects based on single or multiple property values, this complex customizing is not required. Instead, this technique gives the possibility to create multiple collections based on the same child collection, each with individual filters that do not interfere with each other, or else to create filters based on dynamic inputs for Properties or Documents, which are not handled by the Content-Based Filtering functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Basic Implementation ==&lt;br /&gt;
To build the filter in XAML, you will need to place an EvalExpression and a Collection Filter in the Resources of your container (most likely, a Grid). In the container's content, you will need the Input control, and the items control as an output (most likely a ListView).&lt;br /&gt;
&lt;br /&gt;
The following namespaces are used:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;using:UBIK.WinX.Controls&amp;quot;&lt;br /&gt;
xmlns:cv=&amp;quot;using:UBIK.WinX.UI.CollectionView&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmlns:controls=&amp;quot;clr-namespace:UBIK.CPL.Controls;assembly=UBIK.CPL&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
For UWP, it is possible to place the EvalExpression and Collection Filter into the &amp;lt;Grid.Resources&amp;gt;, as shown below. However, for Xamarin, it is required to use the &amp;lt;ContentView.Resources&amp;gt;.&lt;br /&gt;
For the Collection Filter, use [[XAML_Changes_in_UBIK_WinX_3.5#Filtering_by_expressions|ListCollectionView]] for UWP &amp;amp; [[Xamarin_XAML#FeatureRelated|Content_filtering]] for Xamarin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
	&amp;lt;cv:ListCollectionView&lt;br /&gt;
		x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
		Expression=&amp;quot;{Binding ElementName=FilterExpression, Path=Result}&amp;quot;&lt;br /&gt;
		ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note that the EvalExpression in UWP requires an x:Name, which in turn requires the 'ElementName' syntax seen in the &amp;lt;cv:ListCollectionView&amp;gt;.}}&lt;br /&gt;
{{Attention|Note that the Converter seen in the 'EXP' EvalExpressionParameter in UWP is 'StringFormatConverter', which is different than in Xamarin.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentView.Resources&amp;gt;&lt;br /&gt;
    &amp;lt;ResourceDictionary&amp;gt;&lt;br /&gt;
		&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
		&amp;lt;controls:SfDataSourceExt &lt;br /&gt;
			x:Key=&amp;quot;FilterView&amp;quot;&lt;br /&gt;
			Expression=&amp;quot;{Binding Source={StaticResource FilterExpression}, Path=Result}&amp;quot;&lt;br /&gt;
			ItemsSource=&amp;quot;{Binding Children.Items}&amp;quot; &lt;br /&gt;
                         Unloaded=&amp;quot;{Binding SkipFiltering}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;
&amp;lt;/ContentView.Resources&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Attention|Note that Unloaded attribute improves performance by preventing refiltering while navigating away from the page. This attribute should be added to all instances of controls:SfDataSourceExt in your customizing.}}&lt;br /&gt;
{{Hint|Note that the EvalExpression in Xamarin requires an x:Key, which in turn requires the 'StaticResource ' syntax seen in the &amp;lt;controls:SfDataSourceExt&amp;gt;.}}&lt;br /&gt;
{{Hint|Note that the Converter seen in the 'EXP' EvalExpressionParameter in Xamarin is 'StringFormat', which is different than in UWP.}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The EvalExpression Expression first checks whether the TextBox input is empty (as this would otherwise incorrectly be considered a filter input, whereby the property should be empty) and if so returns the unfiltered list (expression outcome hardcoded to 'true'), otherwise, applies the filter (expression outcome is taken from string constructed in ConverterParameter of 'EXP').&lt;br /&gt;
&lt;br /&gt;
There are two important details of the EvalExpressionParameter to note here: &lt;br /&gt;
* The &amp;quot;ElementName=NameInput&amp;quot; / &amp;quot;x:Reference NameInput&amp;quot; should match exactly to the name of your Input control.&lt;br /&gt;
* The Item.Values[&amp;amp;quot;NAME&amp;amp;quot;] should be adapted, by changing NAME to the property that should be filtered by this input.&lt;br /&gt;
&lt;br /&gt;
=== TextBox / Entry ===&lt;br /&gt;
The input field is just a basic &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt; we will use to input the filter criteria value. The only important detail for this input control is the name, which must be passed back to the EvalExpressionParameter.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It will look like this:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Items control  ===&lt;br /&gt;
An items control will likely be used for displaying filtered results, such as &amp;lt;controls:SelectionBoundListView&amp;gt; for UWP &amp;amp; [[Xamarin_XAML#Performance|SfListViewExt]] for Xamarin:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SelectionBoundListView&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryList&amp;quot;     &lt;br /&gt;
       ItemsSource=&amp;quot;{StaticResource FilterView}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:SfListViewExt&lt;br /&gt;
       x:Name=&amp;quot;FilterQueryResultList&amp;quot;&lt;br /&gt;
       ItemsSource=&amp;quot;{Binding DisplayItems, Source={StaticResource FilterView}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multiple Dynamic (User Inputs) Criteria ==&lt;br /&gt;
It is likely that the customizing is required to process multiple user inputs for the same filter. In this case, the EvalExpression must be adapted to combine the inputs (most likely using an AND relation, for a 'filtering-down' effect), as well as to deliver the full list when nothing is inputted.&lt;br /&gt;
A &amp;lt;Textbox&amp;gt; / &amp;lt;Entry&amp;gt;, and an EvalExpression, will be required for every additional property, as well as a final EvalExpression to combine them.&lt;br /&gt;
&lt;br /&gt;
The EvalExpressions should be amended as follows:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DescInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;NAME&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Desc_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Values[&amp;amp;quot;DESCR&amp;amp;quot;].ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DescInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows how to check for inputs to either property, NAME and DESCR, then use an additional EvalExpression to create the expression string that combines them. For each additional property you need to:&lt;br /&gt;
* Create an EvalExpression that checks whether the text input is null or empty, and if not, returns the desired expression EXP.&lt;br /&gt;
*  Add each EvalExpression (Name_FilterExpression, Desc_FilterExpression) to the 'main' one (FilterExpression) as Parameters, combined using the escaped '&amp;amp;&amp;amp;' concatenation symbols.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Due to the escaped syntax required in the Expression, &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;+&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+&amp;lt;/source&amp;gt; is the correct syntax required to concatenate filter expressions together.}}&lt;br /&gt;
&lt;br /&gt;
Once the additional input controls have been created, processed in their own EvalExpressions, referenced as EvalExpressionParameters and the &amp;quot;FilterExpression&amp;quot; EvalExpression has been adapted as shown, the filter should already function as required; the Collection Filters and Items Controls do not need to be adapted.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Input To Filter Multiple Properties ===&lt;br /&gt;
Since we have control over how the input is matched against the properties, is possible to use the same input to filter against multiple properties, for example, both Title and SubTitle. This keeps the UI lean with less elements to clutter the layout, and the user is not forced to think about which input relates to which field. The downside, of course, is that the search will be slightly less refined.&lt;br /&gt;
This is achieved easily as shown:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=FilterInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT &amp;quot; Value=&amp;quot;{Binding ElementName=Title_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding ElementName=SubTitle_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Title_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Title.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;SubTitle_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.SubTitle.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference FilterInput}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;TIT +&amp;amp;quot;||&amp;amp;quot;+ SUB&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;TIT&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Title_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;SUB&amp;quot; Value=&amp;quot;{Binding Source={StaticResource SubTitle_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Note the different operator required in this case. Unless your object has the same Title ''and'' SubTitle, there will be no match found unless the FilterExpression is amended to an Or relationship.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Combining Dynamic (User Inputs) and Static (Predefined) Criteria ==&lt;br /&gt;
A common use of the Collection Filter is to filter child lists based on one or multiple properties, such as MetaDefinition.UID or a certain status, to present groups of specific object types. Therefore, it is likely that a customizing may require hardcoded filter criteria, combined with user input, if any is provided.&lt;br /&gt;
&lt;br /&gt;
The following describes how to implement such a scenario in XAML, again using [[:Category:Multiple Dynamic (User Inputs) Criteria]] as a starting point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding ElementName=Desc_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower()==&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ DESC +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;DESC&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Desc_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT&amp;quot; Value=&amp;quot;{StaticResource Static_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once one or multiple EvalExpressions have been added to process each input (such as Name_FilterExpression, Desc_FilterExpression), the remaining predefined filter criteria, in this example, filtering for a specific MetaClass by UID, can be added as an x:String, or directly in the EvalExpression paramerter, though the first approach is recommended, for better readability.&lt;br /&gt;
&lt;br /&gt;
{{Attention|The above syntax only works for individual static string filters. If you need to chain multiple hardcoded filters, such as filtering in several UIDs, they need one String resource each, and must be added to the FilterExpression expression individually as in the below example.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple Static Criteria ===&lt;br /&gt;
Experimentation has shown that the dynamic filter struggles to combine a single string made of multiple expressions, with additional expressions via the FilterExpression. However, it is still possible to combine user inputs and multiple static criteria, simply by breaking up the static criteria into separate strings. &lt;br /&gt;
&lt;br /&gt;
Of course, when for example filtering various MetaDefinitions.UIDs, the '&amp;amp;amp;' (and) comparison condition is no longer appropriate, as there will never be matches for multiple of these UIDs that returns a true result. In these cases, the comparison condition needs to be set to '||' ([[HowTo:Implement_Custom_Filtering#.27Or.27_Operations|Or]]).&lt;br /&gt;
The below example shows the correct syntax.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;8ca1-4597cc2ae621-6f73cde9-ed38-4cbd&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding ElementName=Name_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
⛔️ '''Don't Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&amp;lt;x:String x:Key=&amp;quot;Static_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true &amp;amp;amp;&amp;amp;amp; Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
✅ '''Instead Do:'''&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static1_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;6f73cde9-ed38-4cbd-8ca1-4597cc2ae621&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&amp;lt;x:String x:Key=&amp;quot;Static2_FilterExpression&amp;quot;&amp;gt;Item.Content.MetaDefinition.UID.ToString().ToLower().Equals(&amp;amp;quot;4597cc2ae621-6f73cde9-ed38-4cbd-8ca1&amp;amp;quot;)==true&amp;lt;/x:String&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;NAME +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ STAT1 +&amp;amp;quot;||&amp;amp;quot;+ STAT2&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;NAME&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Name_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT1&amp;quot; Value=&amp;quot;{StaticResource Static1_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;STAT2&amp;quot; Value=&amp;quot;{StaticResource Static2_FilterExpression}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
{{Hint|Note that the above strings make use of the .Equals() method, which is an alternate option to the more commonly seen &amp;lt;nowiki&amp;gt;'Item.Content.MetaDefinition.UID.ToString().ToLower()==...&amp;lt;/nowiki&amp;gt;'}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Property Types ==&lt;br /&gt;
&lt;br /&gt;
=== Filtering an INT / Double ===&lt;br /&gt;
Though the string comparison works mostly the same for a Int / Dbl, you additionally have to include a .ToString() method to the EXP EvalExpressionParameter of that property's individual EvalExpression for it to evaluate:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
ConverterParameter='Item.Values[&amp;amp;quot;INSTRUCTIONID&amp;amp;quot;].ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a Boolean (CheckBox) ===&lt;br /&gt;
To process a Boolean filter, the expression needs to be slightly amended, due to the different type of filter match criteria that is required.&lt;br /&gt;
&lt;br /&gt;
Note that the below implementation returns all items by default (ie. when the CheckBox is unchecked), and returns only True matches when the CheckBox is checked. This functionality is designed to align with string input, where no filtering occurs for each string until something is entered into the corresponding text input box.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Note that this example uses UWP xaml syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Bool_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==false) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Values[&amp;amp;quot;MP_BOOL&amp;amp;quot;]==&amp;amp;quot;{0}&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=CheckBox, Path=IsChecked}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The individual EvalExpression for a Boolean filter match needs to be amended as follows:&lt;br /&gt;
** The INPUT can never be null, as the IsChecked property is either True or False. Therefore we can remove the Null or empty test, and instead, check whether the CheckBox is checked or not. IsChecked=False should 'escape' the expression, and return all items (or, not contribute to the overall filtering).&lt;br /&gt;
* The EvalExpressionParameter 'EXP' similarly can be simplified, as it does not need to make a string match with .Contains, but simply check whether the property value matches to True or False.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Changes only need to be made to the individual EvalExpression. The &amp;quot;FilterExpression&amp;quot; that joins all individual expressions does not need to be amended, other than the regular additional EvalExpressionParameter, and updating the expression accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filtering a GUID Property ===&lt;br /&gt;
The expression string seen in the &amp;quot;EXP&amp;quot; command parameters shown above compare a user input with the value stored in Values[MP_PROPERTY], of the requested property. However, in certain cases, it may not be adequate to search in Values[MP_PROPERTY], such as when the property is a GUID. This is because Values[LK_GUID_PROPERTY] returns the UID value of the linked object, whereas Properties.VisibleItems[LK_GUID_PROPERTY].DisplayValue returns the human readable label associated with this linked object. &lt;br /&gt;
&lt;br /&gt;
The solution is to rewrite the expression string to target the correct binding:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=NameInput, Path=Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference NameInput}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.Properties.VisibleItems[&amp;amp;quot;LK_GUID_PROPERTY&amp;amp;quot;].DisplayString.ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good way to inspect and test the target binding is to output it on the items UI, therefore on the ItemTemplate of your ListView, as well as to output the expressions that are being dynamically generated in your EvalExpressions, by binding the Result to the Text property of a &amp;lt;TextBlock&amp;gt; (UWP) or &amp;lt;Label&amp;gt; (Xamarin).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
=== Filtering a DateTime Property ===&lt;br /&gt;
Filtering a DateTime property is more complex than other properties, because one has to consider both the input, and the type of filtering. &lt;br /&gt;
&lt;br /&gt;
Input can be done both as freetext, and using a DatePicker. Freetext input has the downside that users have to take care to enter the correct string format (ie. yyyy/MM/dd), whereas the DatePicker outputs a DateTime string which can then be formatted for use in the EvalExpression. The DatePicker does however have certain downsides, chief of which being that it is not nullable, the current date is shown when no date has been selected, making the non-filtered UI indistinguishable from the filtered one.&lt;br /&gt;
&lt;br /&gt;
Filtering can be done as a simple comparison, such as finding an object whose date matches the inputted date. However, it is also possible to ranges; either 'open', that is, dates before or after the user's selection, or 'closed', which is a date falling inside a range created by two user inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Input ====&lt;br /&gt;
The input method is the first important consideration for filtering DateTime properties. A DatePicker is the generally accepted method. Textbox input is also possible, though users will need to correctly format their input to 'yyyy/MM/dd' (such as &amp;quot;2032/12/31&amp;quot;) in order to achieve a valid comparison.&lt;br /&gt;
&lt;br /&gt;
'''DatePicker'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DatePicker&amp;quot; Tag=&amp;quot;{Binding SelectedDate, ElementName=DatePicker, Converter={StaticResource StringFormatConverter}, ConverterParameter='{0:yyyy/MM/dd}'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DatePicker x:Name=&amp;quot;DateInput&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;Label x:Name=&amp;quot;DateString&amp;quot; Text=&amp;quot;{Binding Path=Date, Source={x:Reference DateInput}, StringFormat='{0:yyyy/MM/dd}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|In both cases, it is necessary that the format of the input matches the format of the property value, which will be explained more in the Comparison section below. In the above examples, this is applied in the Tag property (UWP) or through use of a secondary control (a Label in the Xamarin example).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Freetext'''&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;DateInput&amp;quot; PlaceholderText=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;DateInput&amp;quot; Placeholder=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Attention|Remember that no matches will be found unless the date is inputted following a 'yyyy/MM/dd' format.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|For greater control over the input format, it is also possible to provide multiple TextBoxes, which could then either be concatenated in an EvalExpression, or used to filter by the DateTime.Day/Week/Month values of the property individually, if such functionality fits the usecase.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Comparison ====&lt;br /&gt;
Since the EvalExpression approach utilizes string comparisons, not only is it necessary to format the input string, but the property value must also be formatted to match. The 'yyyy/MM/dd' format includes several measures to create the best conditions for comparing the two strings; &lt;br /&gt;
* months and days below the value of 10 cannot be a single digit, but must be padded with a preceding 0 in order to keep the string lengths equivalent; 2032/1/1 cannot be property compared with 2032/12/31 for example, as the strings are different lengths.&lt;br /&gt;
* putting the year and month first also improves the chance of a correct comparison, as a day 01 can be after a day 31 if the month and year are greater.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Attention|For the rest of this section, a DatePicker input is assumed.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Single'''&lt;br /&gt;
&lt;br /&gt;
Comparison of a single date against a property value works the same way as other dynamic filters. Therefore it is sufficient to make use of the previously used .Contains() or .Equals() methods. &lt;br /&gt;
Remember that the Date attribute is not directly usable from the DatePicker, and it's formatted version received via the Tag attribute or an additional label is what is actually used by the EvalExpressions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=DatePicker, Path=Tag}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Path=Text, Source={x:Reference DateString}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Range'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It is also possible to filter not for a specific date, but rather for all items whose property falls after or before the user input (depending on whether a  'Starting From' or 'Ending By' comparison is implemented. An 'open' range filter is created when only one value is inputted by the user, whereas a 'closed' range has a start and end date, and must fall on or in between these two.&lt;br /&gt;
&lt;br /&gt;
For range comparison, we use the  [https://learn.microsoft.com/en-us/dotnet/api/system.string.compareto?view=net-9.0 Microsoft .CompareTo method]. As documented there, this method outputs a -1/0/1 depending on the compared string's location in the range. Our expression can target one output for an 'exclusive' filter (in which the inputted date is not considered for the range), however, a more likely scenario is that the user wants the inputted date included in the filter. This is why the expression in the StringFormatConverter should be defined for start date as !=-1, and for end date as !=1; the instance should be not less than than the start date (where true would be an output of 0 or 1), and not greater than the end date (true = -1 or 0), respectively.&lt;br /&gt;
&lt;br /&gt;
Similar to the earlier section on [[HowTo:Implement_Custom_Filtering#Multiple_Dynamic_.28User_Inputs.29_Criteria|multiple inputs]], separate EvalExpressions are used for each half of the range, meaning that the filtering also works (as an 'open Range' filter) when only one value is inputted by the user. If an open range filter is all that is required by the usecase, the second input and EvalExpression can simply be eliminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Start_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=StartInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;End_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding ElementName=EndInput, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding ElementName=Start_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding ElementName=End_FilterExpression, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Start_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;-1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference StartString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;End_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).CompareTo(&amp;amp;quot;{0}&amp;amp;quot;)!=&amp;amp;quot;1&amp;amp;quot;'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding Source={x:Reference EndString}, Path=Text}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;START +&amp;amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;amp;quot;+ END&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;START&amp;quot; Value=&amp;quot;{Binding Source={StaticResource Start_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;END&amp;quot; Value=&amp;quot;{Binding Source={StaticResource End_FilterExpression}, Path=Result}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note the .CompareTo method used in each half of the ranged filter expression; the start date comparison is &amp;lt;noWiki&amp;gt;!=-1&amp;lt;/noWiki&amp;gt;, whereas the end date comparison &amp;lt;noWiki&amp;gt;!=1&amp;lt;/noWiki&amp;gt;.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
==== Individual DateTime Components ====&lt;br /&gt;
The DateTime property has the additional benefit of exposing components that can be used to refine filtering.&lt;br /&gt;
&lt;br /&gt;
[[Developer_Mode]] reveals the members available under the binding path; &amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;PropertyItems[&amp;quot;DATETIME&amp;quot;].Value&amp;lt;/source&amp;gt;&lt;br /&gt;
These include; Date, Day, DayOfWeek, DayOfYear, Hour, Millisecond, Minute, Month, Ticks, TimeOfDay, and Year.&lt;br /&gt;
&lt;br /&gt;
These can be used in the EvalExpressionParameter as a binding in the custom expression string, as follows, and can even be used in separate filters to search individual components of the date seperately (for example, to filter by a particular month, year, or even day of the week).&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding ElementName=DateInput, Path=Tag, Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding Source={x:Reference DayWeekInputString}, Path=Text, Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;DATE&amp;amp;quot;].Value.DayOfWeek.ToString().ToLower().Contains(&amp;amp;quot;{0}&amp;amp;quot;.ToLower())==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;br /&gt;
&lt;br /&gt;
== Adjustments ==&lt;br /&gt;
=== 'Or' Operations ===&lt;br /&gt;
All examples of multiple inputs in this article use an 'and' filter condition, where, if any inputs are entered, only items that match all inputs (NAME &amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt; DESC) are kept in the collection, to produce a 'filtering down' effect in the user interface.&lt;br /&gt;
&lt;br /&gt;
If a less strict filter condition is required, the FilterExpression can be altered to have an 'or' condition, where all results that match NAME &amp;lt;b&amp;gt;or&amp;lt;/b&amp;gt; DESC, but not necessarily both, are shown. To do so, simply change the concatenation syntax to return 'or' symbols (two pipes or '||'):&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;amp;quot;||&amp;amp;quot;+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Displaying a Count ==&lt;br /&gt;
To display the filtered count, use the following syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;{Binding Path=Count, Source={StaticResource FilterView}}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persisting Filter Values ==&lt;br /&gt;
{{UnderConstructionStart}}&lt;br /&gt;
One of the drawbacks of this method of filtering is the inability for the UI to 'remember' user inputs when they navigate away from the page. This is because this implementation of dynamic filters exists solely on the UI thread (that is, is defined in XAML only with no actual connection to the data, opposite to [[Property_Based_Content_Filters]], for example), which is re-rendered according to the xaml definition every time the page is loaded. This section describes how to implement a limited solution to this issue, the limitation being that values can currently only be persisted during the 'session', and are lost when the user closes the client.&lt;br /&gt;
&lt;br /&gt;
This solution involves use of the StoreProfileParametersCommand to create key-value pairs (a simple list of items made up of a name and a value), which can then be read using the 'StoredProfileParameters[key]'. The StoreProfileParameterCommand accepts a CommandParameter with the format 'key=value', where 'key' represents the name of the key-value pair that can be used to reference it later (in the case below, &amp;quot;name&amp;quot;), and 'value' represents what string should be returned by referencing it (in this case, the Text attribute of the text field control).&lt;br /&gt;
&lt;br /&gt;
When a user completes their input, we use the StoreProfileParametersCommand to create or update a key-value pair associated with a particular filter, instead of passively reading the value from the input as was done previously. &lt;br /&gt;
&lt;br /&gt;
Furthermore, the associated StoredProfileParameter is fed back to the input control so that if any value is set for that particular key (ie. if a filter value has been created), it will be displayed on the input control. Otherwise, the input control will be reset when next loading the page, as was previously the case with dynamic filtering, whereas the StoredProfileParameter will be persisted, leading to a mismatch between the UI and filtering state.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TextBox x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameter[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;core:EventTriggerBehavior EventName=&amp;quot;LostFocus&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;core:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Text, ElementName=NameInput, Converter={StaticResource StringFormatConverter}, ConverterParameter='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/core:EventTriggerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/interactivity:Interaction.Behaviors&amp;gt;&lt;br /&gt;
&amp;lt;/TextBox&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pay attention to which [https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.textbox?view=winrt-26100#events Event] is used to trigger the StoreProfileParameterCommand. The above example uses LostFocus, which fires when the user clicks out of the TextBox. Another possible choice is TextChanged, however, this means that the command will fire with every keystroke, which may reduce overall performance.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Entry x:Name=&amp;quot;NameInput&amp;quot; Text=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Entry.Behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors:EventHandlerBehavior EventName=&amp;quot;Completed&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;behaviors:InvokeCommandAction Command=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot; CommandParameter=&amp;quot;{Binding Path=Text, Source={x:Reference NameInput}, StringFormat='name={0}'}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/behaviors:EventHandlerBehavior&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry.Behaviors&amp;gt;				&lt;br /&gt;
&amp;lt;/Entry&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Xamarin 'Completed' event fires when the user clicks the return button on their onscreen keyboard.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
{{Hint|StringFormatConverter/StringFormat is used to format the key-value pair as required by the StoreProfileParameterCommand. The key is hardcoded into the formatted string as, for example &amp;lt;noWiki&amp;gt;'name={0}'&amp;lt;/noWiki&amp;gt;. The dynamic value, in this case whatever is inputted in the text field when the edit is completed, replaces the &amp;lt;noWiki&amp;gt;{0}&amp;lt;/noWiki&amp;gt; tag when the binding is evaluated (ie. when the command is executed).}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this implementation, the EvalExpression also needs to be adapted to check whether a particular filter value exists within the StoredProfileParameters list, instead of simply whether the associated input control has a value or selection:&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;UWP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Name=&amp;quot;Name_FilterExpression&amp;quot; Context=&amp;quot;{Binding}&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormatConverter}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:EvalExpression x:Key=&amp;quot;Name_FilterExpression&amp;quot; Expression=&amp;quot;(INPUT==null||INPUT==&amp;amp;quot;&amp;amp;quot;) ? &amp;amp;quot;true==true&amp;amp;quot; : EXP &amp;quot; Context=&amp;quot;{Binding}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;EXP&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name], Converter={StaticResource StringFormat}, ConverterParameter='Item.PropertyItems[&amp;amp;quot;NAME&amp;amp;quot;].Value.ToString(&amp;amp;quot;yyyy/MM/dd&amp;amp;quot;).Contains(&amp;amp;quot;{0}&amp;amp;quot;)==true'}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;controls:EvalExpressionParameter Name=&amp;quot;INPUT&amp;quot; Value=&amp;quot;{Binding StoredProfileParameters[name]}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/controls:EvalExpression&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hint|Note how the EvalExpressionParameters have been adapted to reference a StoredProfileParameter, rather than the input control.}}&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Item Selection ===&lt;br /&gt;
Filter value persistence works also when the user input method is to select an item from a picker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Xamarin&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang = &amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;controls:PickerExt&lt;br /&gt;
    x:Name=&amp;quot;ExamplePicker&amp;quot;&lt;br /&gt;
    ItemsSource=&amp;quot;{Binding Children.Items[0].PropertyItems[PROPERTY].MetaProperty.SelectiveList, Converter={StaticResource SelectiveListToItems}, TargetNullValue='', FallbackValue=''}&amp;quot;&lt;br /&gt;
    ItemDisplayBinding=&amp;quot;{Binding DisplayText}&amp;quot;&lt;br /&gt;
    SelectedValuePath=&amp;quot;Value&amp;quot;&lt;br /&gt;
    SelectedValue=&amp;quot;{Binding StoredProfileParameters[key]}&amp;quot;&lt;br /&gt;
    SelectionChangedCommand=&amp;quot;{Binding StoreProfileParameterCommand}&amp;quot;&lt;br /&gt;
    SelectionChangedCommandParameter=&amp;quot;{Binding SelectedItem.Value, Source={x:Reference ExamplePicker}, StringFormat='key={0}'}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Text Input in ListView Header Template ===&lt;br /&gt;
This implementation will not work when parts of it, such as the Input fields, are hosted in a ListView header or footer template, as this content is not readable by the rest of the page and will return a &amp;quot;Can not find the object referenced&amp;quot; parsing error.&lt;br /&gt;
&lt;br /&gt;
To workaround this, you need to move the Input control out of the header template.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
* Everything looks correct but filtering returns no results:&lt;br /&gt;
** Ensure that the string you are trying to filter by matches what is returned as the DisplayValue.&lt;br /&gt;
** If the property is a INT / DBL (Integer or Double) type: The string comparison doesn't work directly with non-string types. Check the [[HowTo:Implement_Custom_Filtering#Other_Property_Types|Other Property Types]] section.&lt;br /&gt;
** If filtering a DateTime property, ensure the formatting of the input matches that of the property value in the EXP string.&lt;br /&gt;
** If filtering a GUID property, ensure the same values are compared; DisplayString if the user is inputting readable text, UID if the user has selected an item from a list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[XAML]]&lt;br /&gt;
* [[XAML_Tips]]&lt;br /&gt;
* [[Xamarin_XAML]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Client|Custom Filtering]]&lt;br /&gt;
[[Category:Filtering|Custom Filtering]]&lt;br /&gt;
[[Category:Styling|Custom Filtering]]&lt;br /&gt;
[[Category:WinX|Custom Filtering]]&lt;br /&gt;
[[Category:XAML|Implement Custom Filtering]]&lt;br /&gt;
[[Category:Xamarin|Custom Filtering]]&lt;/div&gt;</summary>
		<author><name>REP</name></author>	</entry>

	</feed>