c# - 自定义所选(当前)FlyoutItem 的样式

标签 c# xaml xamarin.forms xamarin.forms.shell

我注意到,当我自定义弹出项目外观时,就像这里所说的 in the docs ,当前的 FlyoutItem 不再被标记。

从文档中截取代码以更改项目外观:

<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

人们会认为还必须有某种 Shell。当前/事件/选定ItemTemplate 自定义,但我找不到它。

有什么想法可以自定义当前的 shell 项目外观,或者至少使默认项目标记与 Shell.ItemTemplate 一起使用吗?

最佳答案

不幸的是。来自 Xamarin.Forms - Xaminals sample ,也会出现这种现象。 这应该是当前版本的 XF 中 Shell FlyoutItem 的限制

<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.ItemTemplate ,则标记 selectitem:

enter image description here

其他选择项未标记:

enter image description here

======================================更新==== =============================

解决方案:

如果给模板添加样式,选择后可以保持选中状态。

Shell.Resources:添加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>

Shell.ItemTemplate中使用如下:

<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>

最终呈现效果:

enter image description here

关于c# - 自定义所选(当前)FlyoutItem 的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57421964/

相关文章:

wpf - 我可以让 WPF 样式优先于本地值吗?

android - 如何更改 xamarin.android 中默认显示警报的背景颜色?

xamarin.forms - 如何将 View 添加到框架

c# - Html.OpenIdSelectorScripts 辅助方法抛出 NullReferenceException

c# - 使用 ItemSource 绑定(bind)访问 ListView 内的另一个数据上下文

c# - UWP RichEditBox : How to enable HyperLinks for loaded RTF files (Document. LoadFromStream)

c# - Xamarin.Forms 的 Plugin.BLE 未检测到设备

c# - 如何使用显式对齐(非托管 dll)将结构从 C 编码到 C#

c# - 使用 Automapper 覆盖现有映射

c# - 统一构建后在数据文件夹中复制一些额外的文件