-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
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"
>