Search code examples
c#xamlxamarin.formsxamarin.forms.shell

Costumize style of the selected (current) FlyoutItem


I've noticed that when I customize flyout item appearance like it says here in the docs, the current FlyoutItem is not marked anymore.

Snip of the code from docs to change the item appearance:

<Shell ...>
    ...
    <Shell.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.2*" />
                    <ColumnDefinition Width="0.8*" />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding FlyoutIcon}"
                       Margin="5"
                       HeightRequest="45" />
                <Label Grid.Column="1"
                       Text="{Binding Title}"
                       FontAttributes="Italic"
                       VerticalTextAlignment="Center" />
            </Grid>
        </DataTemplate>
    </Shell.ItemTemplate>
</Shell>

Screenshot before Shell.ItemTemplate
Screenshot after Shell.ItemTemplate

One would assume there must also be some kind of Shell.Current/Active/SelectedItemTemplate customization, but I can not find it.

Any ideas how I can customize current shell item appearance, or at least make the default item marking work with Shell.ItemTemplate?


Solution

  • Unfortunately.From Xamarin.Forms - Xaminals sample , also occurs this phenomenon. This should be a limit of Shell FlyoutItem in Current version of XF.

    <Shell.ItemTemplate>
        <DataTemplate >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.2*" />
                    <ColumnDefinition Width="0.8*" />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding FlyoutIcon}"
                    Margin="5"
                    HeightRequest="45" />
                <Label Grid.Column="1"
                    Text="{Binding Title}"
                    FontAttributes="Italic"
                    VerticalTextAlignment="Center" />
            </Grid>
        </DataTemplate>
    </Shell.ItemTemplate>
    

    If not using Shell.ItemTemplate , selectitem is marked:

    enter image description here

    Else selectitem is not marked :

    enter image description here

    ===================================UPDATE================================

    Solution:

    If adding style to the template , can hold the selected state after selecting.

    Shell.Resources: adding a FloutItemStyle.

    <Style x:Key="FloutItemStyle" TargetType="Grid">
        <Setter Property="VisualStateManager.VisualStateGroups">
            <VisualStateGroupList>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="Selected">
                        <VisualState.Setters>
                            <Setter Property="BackgroundColor" Value="Accent"/>
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateGroupList>
        </Setter>
    </Style>
    

    Using in Shell.ItemTemplate as follow:

    <Shell.ItemTemplate>
        <DataTemplate >
            <Grid Style="{StaticResource FloutItemStyle}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.2*" />
                    <ColumnDefinition Width="0.8*" />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding FlyoutIcon}"
            Margin="5"
            HeightRequest="45" />
                <Label Grid.Column="1"
            Text="{Binding Title}"
            FontAttributes="Italic"
            VerticalTextAlignment="Center" />
            </Grid>
        </DataTemplate>
    </Shell.ItemTemplate>
    

    Finally showing the effect:

    enter image description here