【问题标题】:GridView vs ButtonsGridView 与按钮
【发布时间】:2013-09-03 06:50:10
【问题描述】:

我的页面中心有一个由 12 个不可点击按钮组成的网格(它们只是指示器),方式如下。

这个网格周围会有更多的东西,我需要这些项目在它们的确切位置并且具有相同的宽度和高度。我很困惑是使用带有(星形大小)行和列的网格,还是使用带有 MaxRowsAndColumns 设置为 3 且方向设置为水平的环绕面板的网格视图。以下是我支持和反对每种方法的论点:-

按钮:-

优点:-

  • 保证固定位置和高度和宽度。
  • 适应所有屏幕尺寸
  • 易于编码

缺点:-

  • 将不得不编写非常大的 XAML 和 C# 代码,因为我将无法在此处使用数据模板,并且必须定义大量变量和网格并分别设置每个文本块的值。

网格视图

优点:-

  • DataTemplate 可以通过 ObservableCollection 轻松设置值
  • 比使用按钮创建的代码更小

缺点:-

  • 不保证项目大小。必须在 XAML 中对其进行硬编码或将其绑定到模型中的属性,然后在 XAML 中计算值。

请告诉我哪个是更好的选择。 除了上面提到的方法,还有其他更简单的方法吗?

谢谢, 拉吉夫

【问题讨论】:

    标签: xaml user-interface windows-8 windows-store-apps winrt-xaml


    【解决方案1】:

    使用ItemsControl,它提供DataTemplate 以及项目大小。

    【讨论】:

      【解决方案2】:

      在以上两个中,我会说 GridView。由于您需要支持这么多不同的屏幕尺寸和比例,因此您不应该使用固定尺寸。

      如指南所述:Guidelines for window sizes and scaling to screens(Windows Store apps)

      设计适合任何宽度的应用,您会自动获得 支持不同的屏幕尺寸和方向。规划您的应用程序 从全屏调整到最小宽度,以便 UI 为各种屏幕尺寸、窗口尺寸和 方向。

      由于您还需要满足快照模式(您不能选择在您的应用程序中不具有该模式),因此拥有按钮会增加更多的手动工作,这意味着维护 UI 代码会非常困难。如果您使用网格视图,您可以将其与用于捕捉模式的列表视图配对(用于完整模式的网格视图,用于捕捉的列表视图),如模板中所示。

      您当然可以限制 GridView 中的大小,而不需要按钮所需工作的五分之一,所以我不太清楚您所说的“不保证项目大小”是什么意思。

      无论如何,正如指南所说,按钮不应该用于导航到页面。这些只是指导方针,但我认为它们是有道理的。

      这里是:Guidelines and checklist for buttons (Windows Store apps)

      当操作是导航到另一个页面时,不要使用按钮;采用 而是一个链接。例外:对于向导导航,使用标有标签的按钮 “返回”和“下一步”。

      如果合适,我会使用 GriView 并将其与语义缩放相结合。

      以 GridView 和 ItemsControl 为例,结果如下:

      UI(视图)代码:

      <Page
          x:Class="App1.MainPage"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          mc:Ignorable="d">
      <Grid>
          <Grid.RowDefinitions>
              <RowDefinition />
                  <RowDefinition />
              </Grid.RowDefinitions>
              <GridView x:Name="gridView">
                  <GridView.ItemTemplate>
                      <DataTemplate>
                          <Border Width="150" Height="150" BorderBrush="Pink" BorderThickness="10" Background="Aqua">
                              <TextBlock Foreground="Black" FontSize="20"  Text="{Binding}"/>
                          </Border>
                      </DataTemplate>
                  </GridView.ItemTemplate>
              </GridView>
              <ItemsControl Grid.Row="1" x:Name="itemscontrol">
                  <ItemsControl.ItemTemplate>
                      <DataTemplate>
                          <Border Width="150" Height="150" BorderBrush="Yellow" BorderThickness="10" Background="LightGreen">
                              <TextBlock Foreground="Black" FontSize="20" Text="{Binding}"/>
                          </Border>
                      </DataTemplate>
                  </ItemsControl.ItemTemplate>
                  <ItemsControl.ItemsPanel>
                      <ItemsPanelTemplate>
                          <WrapGrid Orientation="Horizontal" />
                      </ItemsPanelTemplate>
                  </ItemsControl.ItemsPanel>
              </ItemsControl>
          </Grid>
      </Page>
      

      代码隐藏代码(属于 XAML 的 .cs 文件):

      using System.Collections.Generic;
      namespace App1
      {
          public sealed partial class MainPage
          {
              public MainPage()
              {
                  InitializeComponent();
                  DataContext = this;
                  var items = new List<string> { "Iris", "Paul", "Ben", "Cate", "Daniel", "Ryan", "Iris 2", "Paul 2", "Ben 2", "Cate 2", "Daniel 2", "Ryan 2" };
      
                  gridView.ItemsSource = items;
                  itemscontrol.ItemsSource = items;
              }
          }
      }
      

      分辨率更高的结果,请注意项目保持其固定大小并且不会缩放以适应屏幕。

      使用 GridView 将项目高度拉伸到一行:

      <GridView x:Name="gridView">
          <GridView.ItemTemplate>
              <DataTemplate>
                  <Border Width="150" BorderBrush="Pink" BorderThickness="10" Background="Aqua">
                      <TextBlock Foreground="Black" FontSize="20"  Text="{Binding}"/>
                  </Border>
              </DataTemplate>
          </GridView.ItemTemplate>
          <GridView.ItemContainerStyle>
              <Style TargetType="GridViewItem">
                  <Setter Property="VerticalContentAlignment" Value="Stretch" />
              </Style>
          </GridView.ItemContainerStyle>
          <GridView.ItemsPanel>
              <ItemsPanelTemplate>
                   <VirtualizingStackPanel Orientation="Horizontal" />
              </ItemsPanelTemplate>
          </GridView.ItemsPanel>
      </GridView>
      

      顺便说一句,如果你不知道,GridView 继承自 ItemsControl。

      【讨论】:

      • 谢谢艾瑞斯。我的应用程序不支持快照视图。它不会上传到商店,而是部署在客户端设备上。我打算使用带有网格的按钮作为内容,因为按钮可以在另一个页面上单击,并且我可能能够重用相同的代码。您可以动态(在 C# 中)设置 GridView 项的大小而不将其绑定到模型中的属性吗?
      • 我相信你可以,虽然我从来没有这样做过,因为我一直使用 MVVM。对于项目本身,您可以在数据模板上设置固定大小。给我一分钟,我会为你举个例子。
      • 我不使用 MVVM,并且我看到 Windows 8 应用程序代码总是通过切换具有固定大小项目的数据模板来执行此操作(同时捕捉等)。再次感谢 Iris!
      • NP,很高兴你把它整理好了!
      猜你喜欢
      • 2012-10-14
      • 2012-09-17
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多