【问题标题】:Change ListView SelectionMode Template更改 ListView SelectionMode 模板
【发布时间】:2019-09-24 05:43:46
【问题描述】:

我想更改在 UWP 的 ListView 上显示为具有 SelectionMode=Multiple 的复选框的模板。我不想要一个复选框,而是一个自定义 UI。我的应用程序从 SelectionMode=None 更改为 SelectionMode=Multiple 并返回,我想保留滑动动画。 我的列表显示带有金额的项目,在选择时我想选择金额,而不是复选框。图像应该可视化我的想法: screenshot 我是否需要通过绑定到可见性来手动创建它?这种情况下如何创建“滑动”动画?

问候, 用户3650130

【问题讨论】:

    标签: c# listview uwp uwp-xaml


    【解决方案1】:

    我将编辑答案以使其稍后完成。目前我先分享一下方向。

    实际上,您可以从 (Program Files)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\\Generic 文件夹中找到 generic.xaml
    您将在其中看到带有 x:key="ListViewItemExpanded" 的 ListviewItem 样式,此文件将在以后使用。

    在你的代码中说如果你有一个列表视图,你可以把上面的样式放在你的 itemcontainerstyle 中,比如:

     <ListView  SelectionMode="Multiple">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
                    <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
                    <Setter Property="BorderBrush" Value="{x:Null}" />
                    <Setter Property="BorderThickness" Value="0" />
                    <Setter Property="Background" Value="Transparent" />
                    <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}" />
                    <Setter Property="TabNavigation" Value="Local" />
                    <Setter Property="IsHoldingEnabled" Value="True" />
                    <Setter Property="Padding" Value="12,0,12,0" />
                    <Setter Property="HorizontalContentAlignment" Value="Left" />
                    <Setter Property="VerticalContentAlignment" Value="Center" />
                    <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}" />
                    <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}" />
                    <Setter Property="AllowDrop" Value="False" />
                    <Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}" />
                    <Setter Property="FocusVisualMargin" Value="0" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListViewItem">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="80"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <ComboBox Grid.Column="0">
                                        <x:String>1</x:String>
                                        <x:String>2</x:String>
                                    </ComboBox>
                                    <ContentPresenter Grid.Column="1"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListView.ItemContainerStyle>
    
            <x:String>1</x:String>
            <x:String>2</x:String>
            <x:String>3</x:String>
            <x:String>4</x:String>
            <x:String>5</x:String>
            <x:String>6</x:String>
        </ListView>
    

    你会发现你只能看到你的内容,对吧?这里的实际问题与 MultiSelectSquare 有关,它是样式中的字体图标的边框,它控制此处复选框的行为。我们需要删除它并将combox放在那里。但它会导致异常,因为一些变换/动画的目标是这个边界。我们需要对其进行修改以使其正常工作。你可以先从这个方向开始。


    我修改了上面的代码并在控件模板中添加了以下行:

                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="80"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <ComboBox Grid.Column="0">
                                    <x:String>1</x:String>
                                    <x:String>2</x:String>
                                </ComboBox>
                                <ContentPresenter Grid.Column="1"/>
                            </Grid>
    

    如您所见,如果添加此内容,您将看到内容和组合框。但是,正如我所提到的,如果我们只是这样做,我们会错过功能和动画,我们还需要根据默认样式修改视觉状态。


    好的。所以现在你明白了关键点是什么。然后我们需要考虑默认模板,请从 generic.xaml 中搜索 ListViewItemExpanded 资源。注意称为“MultiSelectSquare”的边框吗?有四个与动画相关的东西:“MultiSelectSquare”“MultiSelectClipTransform”“MultiSelectCheckBoxTransform”“MultiSelectCheck”。一个简单的演示就像,将 FontIcon 替换为 Combobox,但保留 MultiSelectCheck 作为 Combobox 的名称。然后删除visualstategroup中关于MultiSelectCheck的任何动画。您会看到虽然它是一个显示的复选框,但当您单击它时,它实际上是弹出一个组合框。

    但是对于复杂的演示,您必须为每个状态自己编写自己的动画。

    【讨论】:

    • 感谢您的帮助;使用您的解决方案,我只能在选择时看到我的内容。我假设我必须使用 ContentPresenter 来显示我的 ComboBox,对吧?我以前从未使用过它。
    • @user3650130 很抱歉造成混淆。我把 contentpresenter 放在这里只是为了测试目的。 Contentpresenter是用来展示绑定内容的,查看默认样式的时候发现有个叫MultiSelectSquare的边框,这个其实就是checkbox所在的位置。为了让大家看懂代码,我用一个简单的demo来修改一下吧。
    • 我确认我看到了组合框和内容。同时,更改 SelectionMode 不会改变任何内容。没有动画或变化。现在下一步应该做什么?
    • @user3650130 我已经为您的方向进行了编辑。一般来说,您可能必须自己重写整个动画才能使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多