【问题标题】:Gridview Item dynamic width according to Screen Size in UWPUWP中根据屏幕大小的Gridview Item动态宽度
【发布时间】:2016-12-14 09:53:37
【问题描述】:

我创建了一个通过数据绑定获取数据的 GridView。我接下来要做的是根据屏幕大小使 GridView 项目宽度动态化(就像他们在 Windows 10 新闻、体育应用等中所做的那样)到目前为止,我已经完成了通过将水平对齐设置为拉伸,使用视觉状态管理器成功获得最小窗口宽度 0,但对于其他更宽的窗口大小,我无法继续此操作。

我们将不胜感激。

【问题讨论】:

  • 您熟悉视觉状态的自适应触发器吗?到目前为止,您到底尝试了哪些方法,哪些方法不适合您?
  • 是的,我已使用自适应触发器来将 minWindowWidth 设置为 800 的视觉状态。我已使用相同的 setter 属性将项目 MinWidth 设置为 300,这是有效的。但我想要做的是根据我们应用程序的窗口大小从窗口宽度 800 及以后动态地使项目的宽度发生变化。我面临的基本问题是,由于我在 setter 属性中定义宽度,它不再是动态的。我该如何解决这个问题??

标签: xaml gridview uwp windows-10 visualstatemanager


【解决方案1】:

如果您希望项目拉伸以填充水平空间并且能够指定每行所需的项目数,那么您必须在 ItemsWrapGrid 中手动设置 ItemWidth GridView 的 SizeChanged 事件。

这是一个例子:

<GridView x:Name="gridView" SizeChanged="onGridViewSizeChanged">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid Background="GreenYellow" BorderBrush="Black" BorderThickness="2">
                <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40"/>
            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>

    <GridView.ItemContainerStyle>
        <Style TargetType="GridViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="Margin" Value="0"/>
        </Style>
    </GridView.ItemContainerStyle>

    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>

    <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>
    <x:String>7</x:String>
    <x:String>8</x:String>
</GridView>
private void onGridViewSizeChanged(object sender, SizeChangedEventArgs e)
{
    // Here I'm calculating the number of columns I want based on
    // the width of the page
    var columns = Math.Ceiling(ActualWidth / 300);
    ((ItemsWrapGrid)gridView.ItemsPanelRoot).ItemWidth = e.NewSize.Width / columns;
}

您也可以将其捆绑到 Behavior 或附加属性中。

【讨论】:

  • 哦,伙计,这太漂亮了!正是我想要的..虽然仍然存在一个小问题:( :(我的gridview包含在一个绑定到数据的pivot控件中。因此我无法从后面的代码访问gridview。正在使用视觉树是解决这个问题的唯一方法??
  • 您需要通过其他方式获取对 GridView 的引用。见stackoverflow.com/a/26801276/734040
猜你喜欢
  • 2016-08-28
  • 2016-12-26
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多