如何使用固定数量的列/行的GridView / AdaptiveGridView?

时间:2018-06-06 10:56:37

标签: c# windows xaml uwp windows-10-universal

我正在开发一种电子库存软件,它复制了组织者的抽屉,所以我需要模仿这些组织者有X列和Y抽屉的事实。

现在,我正在使用AdaptiveGridView(来自Microsoft.Toolkit.Uwp.UI.Controls),并且我将DesiredWidth绑定到计算值== AdaptiveGridView的大小/数量所需的栏目。

这有效,但有一点需要注意:当我达到AdaptiveGridView接受的最小大小DesiredWidth(大约44)时,列数开始缩小(以适应Windows,这是它​​的目的,我知道:))

我尝试将AdaptiveGridView的MinWidth修复为44 *列,并且它可以正常工作,但是,我无法看到最右边的列=>它们开始隐藏在窗户的右侧。

我尝试启用水平滚动,将AdaptiveGridView放在Scrollviewer中,但是我无法获取隐藏列以便访问。

那么,你有没有想法:

  • 让GridView拥有固定数量的列和行?
  • 让AdaptiveGridView让我在其大小为时水平滚动 大于窗户?

全部谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,伙计们,我设法做了我想要的事情!

怎么样?这是......

首先,XAML部分。我将AdaptiveGridView封装在Grid中,将Grid封装在ScrollViewer中。 这里最重要的项目是中间网格。实际上,我将其MinWidth属性绑定到AdaptiveGridView允许的元素的最小大小*我需要的列数,并且我还将其宽度绑定到Scrollviewer的ViewportWidth属性:

<ScrollViewer Name="ScrlV" ZoomMode="Enabled" MaxZoomFactor="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" HorizontalScrollMode="Auto" SizeChanged="ScrlV_SizeChanged">
     <Grid MinWidth="{Binding MinGridSize}" Width="{Binding ElementName=ScrlV, Path=ViewportWidth}">
          <control:AdaptiveGridView HorizontalAlignment="Stretch" Name="itemsGrid" CanReorderItems="True" CanDragItems="True" ItemsSource="{Binding List}" DesiredWidth="{Binding ReqWidth}" Height="auto" ItemTemplate="{StaticResource DrawerItem}" SelectionChanged="itemsGrid_SelectionChanged" AllowDrop="True" DragItemsCompleted="itemsGrid_DragItemsCompleted" />
     </Grid>
</ScrollViewer>

因此,当我更改窗口的大小时,我得到事件并相应地修改我的CurrWidth属性:

    private void itemsGrid_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        Items.CurrWidth = (int)e.NewSize.Width;
    }

然后,在后台,MinGridSize&amp;处理ReqWidth值(最小列宽设置为@ 50):

public int CurrWidth
{
    get
    {
        return currwidth;
    }
    set
    {
        currwidth = value;
        OnPropertyChanged(new PropertyChangedEventArgs("CurrWidth"));
        OnPropertyChanged(new PropertyChangedEventArgs("ReqWidth"));
        OnPropertyChanged(new PropertyChangedEventArgs("MinGridSize"));
    }
}
public int MinGridSize
{
    get
    {
       return 50 * NbrCol;
    }
}
public int ReqWidth
{
   get
   {
      double width = 0;
      if(NbrCol > 0 && CurrWidth > 0)
      {
         width = CurrWidth / NbrCol;
      }
      else
      {
         width = 50;
      }
      return (int)Math.Round(width, 0);
   }
}

因此,AdaptiveGridView获取其DesiredWidth属性集,并且Grid也设置了MinWidth。

最后,Scrollviewer的宽度是窗口1,内部网格相应地适应Scrollviewer ViewportWidth,但是限制为最小宽度=所需列的数量*列的最小尺寸。每当我改变窗口的宽度时,AdaptiveGridView就会发挥作用,直到达到最小宽度。当它发生时,Grid停止收缩,AdaptiveGridView停止适应,我可以水平滚动以查看缺少的列。

干杯!