【问题标题】:UWP - GridView : how to add an "Add" button after the last item?UWP - GridView:如何在最后一项之后添加“添加”按钮?
【发布时间】:2016-10-02 20:00:55
【问题描述】:

我使用 GridView 来显示照片,并寻找一种优雅的方式来允许用户向表单添加新项目。

  • 表单包含很多字段:它显示在一个 Pivot 中,其中每个 PivotItem 代表表单的一个类别。
  • 某些类别包含一个或多个子项:它们通过主从页面显示。

我需要在这个页面中显示照片列表:由于照片代表表单的“子子项”,因此我不会通过 CommandBar 管理添加新照片。但我想在包含照片的 GridView 的最后一项之后使用“添加”按钮。

此时我只找到了部分可行的解决方案:

这是 XAML:

<Grid>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="Photos"  Grid.Row="0"/>
<StackPanel Orientation="Horizontal" Grid.Row="1">
    <GridView ItemsSource="{Binding images}">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Gray" BorderThickness="1" 
                        Padding="10"
                        Height="150" Width="190">
                    <Image Stretch="UniformToFill"
                           Source="{Binding bitmap_image}" />
                </Border>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
    <Border BorderBrush="Gray" BorderThickness="1" 
            Padding="10"
            Height="150" Width="190">
        <Button Command="{Binding Path=DataContext.AddPhotoCommand, ElementName=DetailsPage}"
                Height="100" Width="100">
            <Viewbox>
                <SymbolIcon Symbol="Add"/>
            </Viewbox>
        </Button>
    </Border>
</StackPanel>
</Grid> 

当我使用 StackPanel 时,如果我显示 3 张照片,则添加按钮不再可见...

=> 有更好的方法吗?还是您看到了替代方案?我正在寻找通过 DataTemplateSelector 执行此操作,但这需要我创建一个“假”对象来显示添加按钮...

【问题讨论】:

  • 我会选择 DataTemplateSelector

标签: xaml gridview uwp add datatemplateselector


【解决方案1】:

当我使用 StackPanel 时,如果我显示 3 张照片,则添加按钮不再可见...

如果您不介意按钮在最后一张照片的下一行,您可以使用WinRTXamlToolkitWrapPanel 而不是StackPanel 以避免图片跳出窗口并放置按钮在GridViewFooterTemplate 内:

Xaml:

<Page
x:Class="AddButtonSample.MainPage"
xmlns:controls="using:WinRTXamlToolkit.Controls"
...
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBlock Text="Photos"  Grid.Row="0"/>
    <controls:WrapPanel Orientation="Horizontal" Grid.Row="1">
        <GridView ItemsSource="{Binding images}">
            <GridView.FooterTemplate>
                <DataTemplate>
                    <Button Command="{Binding Path=AddPhotoCommand}" Height="100" Width="100">
                        <Viewbox>
                            <SymbolIcon Symbol="Add"/>
                        </Viewbox>
                    </Button>
                </DataTemplate>
            </GridView.FooterTemplate>
            <GridView.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Gray" BorderThickness="1" 
                    Padding="10"
                    Height="150" Width="190">
                        <Image Stretch="UniformToFill"
                       Source="{Binding bitmap_image}" />
                    </Border>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>
    </controls:WrapPanel>
</Grid>

结果:

如果你真的想把按钮并排放在GridView 的最后一项之后。唯一的选项是DataTemplateSelector

【讨论】:

  • 感谢您的回归!我尝试实现您的解决方案,但遇到了绑定问题,因为我用来显示详细信息的 ContentPresenter 直接绑定到模型:我看不到如何将按钮绑定到主 ViewModel,而其他表单的字段在此 ViewModel 上绑定得很好。关于这一点我创建一个新主题:stackoverflow.com/questions/39835301/…
【解决方案2】:

最好的解决方案可能是使用CommandBar 并将“添加”按钮放在面板的最底部,因为这将最符合 UWP 设计指南。 GridView 也有一个FooterTemplate,它允许您在整个GridView 的页脚中添加一些XAML(但不能直接在项目之后)。

如果您仍希望将添加项作为GridView 内容的一部分,则您确实需要使用假项和DataTemplateSelector。这个解决方案不是很干净,但可能是唯一简单的方法。

【讨论】:

  • 我不明白你在使用命令栏面板底部的“添加”按钮是什么意思:你有链接或示例吗?我将在下次会议上向我的客户介绍这 3 种可能性。
  • 我错过了GridView基本上是一个子子组件的事实,所以CommandBar解决方案在这里可能不是一个好的选择。但是,FooterTemplate 仍然可行。您还可以在GridViewHeaderTemplate 上放置一个添加按钮
【解决方案3】:

我也尝试为自己的应用程序做类似的事情,但确实没有明显的方法来实现它。我的应用程序的一些背景知识:它是一个抽认卡应用程序,在主页的网格视图中显示卡片组,添加按钮位于网格视图的前面。这就是我所做的:

  1. 对于我的甲板类,我给了它一个bool 属性isButton
  2. 在可观察的牌组中,将第一项的isButton设置为true
  3. 为gridview(甲板和按钮)制作两个数据模板,为gridview制作一个数据模板选择器,并检查isButton属性
  4. 如果isButtontrue,模板选择器将使用按钮模板
  5. 否则使用甲板模板

【讨论】:

  • 基本上把其中一张图片做成按钮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多