Alan2
Alan2

Reputation: 24572

How can I set the text color and style of an elements and all its children in C#

I have this code:

<StackLayout x:Name="OuterSL" >
   <StackLayout.Resources>
      <Style TargetType="Label">
         <Setter Property="TextColor" Value="Red" />
         <Setter Property="Style" Value="{StaticResource HelpDetail}" />
      </Style>
   </StackLayout.Resources>
   <Label Text="Overview" />
   <Grid >
      <Grid.Resources>
         <Style TargetType="Label">
            <Setter Property="TextColor" Value="Red" />
            <Setter Property="Style" Value="{StaticResource HelpDetail}" />
         </Style>
     </Grid.Resources>

Can someone tell me how I can do the setting of the TextColor and the Style in the backend C#. In particular I would like to do this for all the children here. So I would need to find all of the Grid's that are part of the StackLayout and set the Text and Style for them also. Note that this for example I just gave a snippet of the code. In the real code I have many Grids inside the StackLayout and I am setting the Resources in them all. Also I don't want to set at the page content level. Just everything inside the StackLayout named OuterSL.

Upvotes: 2

Views: 857

Answers (1)

SushiHangover
SushiHangover

Reputation: 74144

Each Layout control (Grid/Stacklayout/...) has a Children property (a list of Views) and those children can be also be layout containers (or not), so if you recursively descend the view hierarchy you can assign the styles and colors for all the view elements as needed...

This should help you get started.

void SetStyles(IList<View> children, Style style)
{
  foreach (var child in children)
  {
    switch (child)
    {
        case StackLayout s:
            child.Style = style;
            if (s.Children.Count > 0)
                SetStyles(s.Children, style);
            break;
        case Grid g:
            if (g.Children.Count > 0)
                SetStyles(g.Children, style);
            break;
        case Entry e:
            e.TextColor = Color.Red;
            break;
        case Label l:
            l.TextColor = Color.Green;
            break;
        ~~~
    }

 }

Just call it like:

if (Application.Current.Resources.TryGetValue("SomeStackLayoutStyle", out object style))
{
    SetStyles(someStackLayout.Children, Style(style));
}

Upvotes: 1

Related Questions