Alan2
Alan2

Reputation: 24572

Is there a way I can add resources to a page in the C# backend?

I have pages that look like this:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Japanese;assembly=Japanese" xmlns:template="clr-namespace:Japanese.Templates" xmlns:t="clr-namespace:Japanese.Views.HelpTab.Xaml" x:Class="Japanese.Views.HelpTab.AssignMode" Title="Assign Mode Help" BackgroundColor="{DynamicResource PageBackgroundColor}">
    <ContentPage.Content>
        <ScrollView>
            <StackLayout Spacing="0">
                <StackLayout.Resources>
                    <Style TargetType="Frame" CanCascade="true">
                        <Setter Property="Style" Value="{StaticResource FrameBorder}" />
                    </Style>
                    <Style TargetType="Label" CanCascade="true">
                        <Setter Property="TextColor" Value="{DynamicResource HelpTextColor}" />
                        <Setter Property="Style" Value="{StaticResource HD}" />
                    </Style>
                    <Style TargetType="Grid" CanCascade="true">
                        <Setter Property="Style" Value="{StaticResource HG}" />
                    </Style>
                </StackLayout.Resources>

There are about twenty pages in the application that all have the same set of Resources added but not every page.

Is there a way that I can add the resources in the C# backend of my own page and then usesenter code here that for those twenty pages so that all I would need to do is something like this:

<?xml version="1.0" encoding="UTF-8"?>
<MyContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Japanese;assembly=Japanese" xmlns:template="clr-namespace:Japanese.Templates" xmlns:t="clr-namespace:Japanese.Views.HelpTab.Xaml" x:Class="Japanese.Views.HelpTab.AssignMode" Title="Assign Mode Help" BackgroundColor="{DynamicResource PageBackgroundColor}">
    <ContentPage.Content>
        <ScrollView>
            <StackLayout Spacing="0">

Alternatively is there some way I could combine all those resources into just one and add that rather than adding the three individual styles?

Upvotes: 0

Views: 266

Answers (2)

K K
K K

Reputation: 996

You can define resources in App.xaml and use in an entire project using

Application.Current.Resources["AppColor"];

If you want to use in xaml page the use like

<Label TextColor={Binding StaticResource AppColor}/>

Upvotes: 0

Gerald Versluis
Gerald Versluis

Reputation: 34073

Sure, there are a couple of things you can do in this area, but I think it will already help you a lot to know there are implicit and explicit styles.

Start by going to your App.xaml and add your styles there. You should see the <Application.Resources> node already there. You can add the <ResourceDictionary> in there and now define any resources or styles as you wish. Those will be available throughout the whole app.

For instance, in your case, like this:

<Application.Resources>
    <ResourceDictionary>
        <Style TargetType="Frame" CanCascade="true">
            <Setter Property="Style" Value="{StaticResource FrameBorder}" />
        </Style>
        <Style TargetType="Label" CanCascade="true">
            <Setter Property="TextColor" Value="{DynamicResource HelpTextColor}" />
            <Setter Property="Style" Value="{StaticResource HD}" />
        </Style>
        <Style TargetType="Grid" CanCascade="true">
            <Setter Property="Style" Value="{StaticResource HG}" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

Because you are specifying the TargetType and not an x:Key, this is an implicit style. It will apply to all elements of that target type. There is two things you can do now; or create an inheritance of the control and apply the style only to that inheritance, or create an explicit style. You then add the x:Key="MyStyle" attribute to a style and add the Style="{StaticResource MyStyle}" to each element you want to apply the style to. More on styles can be read on the Microsoft Docs.

Upvotes: 1

Related Questions