Skip to content

A global usings/namespaces file to include namespaces and inherit attributes from base page for all xaml files #3376

@MrClan

Description

@MrClan

Summary

A global usings/namespaces file to include namespaces and inherit attributes from base page for all xaml files.

Intended Use Case

This feature request is to have the ability to be able to move any custom namespace imports, to a single file somewhere, so that they don't have to be repeated in every single xaml file over and over again.

An example would look something like this:

Current State

In current state, my pages/views looks like this:

Page1.xaml

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls"
             xmlns:views="clr-namespace:MyCompany.Controls;assembly=MyCompany.Views"
             xmlns:utilControls="clr-namespace:MyCompany.Controls;assembly=MyCompany.UtilControls"
             xmlns:effects="clr-namespace:MyCompany.Controls;assembly=MyCompany.Effects"
             xmlns:renderers="clr-namespace:MyCompany.Controls;assembly=MyCompany.Renderers"
             xmlns:resources="clr-namespace:MyCompany.Controls;assembly=MyCompany.Resources"
             xmlns:converters="clr-namespace:MyCompany.Controls;assembly=MyCompany.Converters"
             xmlns:behaviors="clr-namespace:MyCompany.Controls;assembly=MyCompany.Behaviors"
             xmlns:shadows="clr-namespace:MyCompany.Controls;assembly=MyCompany.Shadows"
             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             ios:Page.UseSafeArea="True"
             NavigationPage.HasNavigationBar="False"
             >

<Label Text="{x:Static resources:Strings.TitleText}" />   
...
</ContentPage>

Page2.xaml

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls"
             xmlns:views="clr-namespace:MyCompany.Controls;assembly=MyCompany.Views"
             xmlns:utilControls="clr-namespace:MyCompany.Controls;assembly=MyCompany.UtilControls"
             xmlns:effects="clr-namespace:MyCompany.Controls;assembly=MyCompany.Effects"
             xmlns:renderers="clr-namespace:MyCompany.Controls;assembly=MyCompany.Renderers"
             xmlns:resources="clr-namespace:MyCompany.Controls;assembly=MyCompany.Resources"
             xmlns:converters="clr-namespace:MyCompany.Controls;assembly=MyCompany.Converters"
             xmlns:behaviors="clr-namespace:MyCompany.Controls;assembly=MyCompany.Behaviors"
             xmlns:shadows="clr-namespace:MyCompany.Controls;assembly=MyCompany.Shadows"
             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             ios:Page.UseSafeArea="True"
             NavigationPage.HasNavigationBar="False"
             >

<Label Text="{x:Static resources:Strings.TitleText}" />   
...
</ContentPage>

But with this feature

GlobalNamespaces.xaml

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls"
             xmlns:views="clr-namespace:MyCompany.Controls;assembly=MyCompany.Views"
             xmlns:utilControls="clr-namespace:MyCompany.Controls;assembly=MyCompany.UtilControls"
             xmlns:effects="clr-namespace:MyCompany.Controls;assembly=MyCompany.Effects"
             xmlns:renderers="clr-namespace:MyCompany.Controls;assembly=MyCompany.Renderers"
             xmlns:resources="clr-namespace:MyCompany.Controls;assembly=MyCompany.Resources"
             xmlns:converters="clr-namespace:MyCompany.Controls;assembly=MyCompany.Converters"
             xmlns:behaviors="clr-namespace:MyCompany.Controls;assembly=MyCompany.Behaviors"
             xmlns:shadows="clr-namespace:MyCompany.Controls;assembly=MyCompany.Shadows"
             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             ios:Page.UseSafeArea="True"
             NavigationPage.HasNavigationBar="False"
             />

And with this file in place, all my views/pages would be simplified as shown below:

Page1.xaml

<ContentPage ...
             >
<Label Text="{x:Static resources:Strings.TitleText}" />
...
</ContentPage>

Page2.xaml

<ContentPage ...
             >
<Label Text="{x:Static resources:Strings.TitleText}" />
...
</ContentPage>

Note that, all the globally imported namespaces are available in all my views, plus any properties set in the base view or global/root page like: ios:Page.UseSafeArea="True" or NavigationPage.HasNavigationBar="False" are automatically applied with inherited values. Of course, setting the same properties in the current page/view would take preference and override any inherited values.

PS:
A further enhancement, and a really useful option, could be to have a property on views to explicitly specify inheritance from the any file (base page or global file) as such:

<ContentPage ...
             inheritsFrom="GlobalNamespaces.xaml"
             >

Or even support import from multiple files:

<ContentPage ...
             inheritsFrom="GlobalNamespaces.xaml,BasePage.xaml"
             >

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions