【问题标题】:Making tiles different size制作不同大小的瓷砖
【发布时间】:2015-11-30 20:02:40
【问题描述】:

我目前有一个Universal Windows Application,它在GridView 内动态创建GridViewItems。在我的例子中,GridViewItems 是瓷砖,瓷砖的大小都相同(因为我在我的 XAML 中通过宽度和高度设置它们)。

我想要不同大小的图块,而不是大小相同的图块,以使其具有 Windows 8/10 的外观和感觉。

我将在下面列出我当前的代码:

<GridView x:Name="tileGridView" Margin="-15,60" HorizontalAlignment="Center" ItemTemplate="{StaticResource TileTemplate}">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>

        <GridView.ItemContainerStyle>
            <Style TargetType="GridViewItem">
                <Style.Setters>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid Background="#2A2A2A"
                                  Margin="5"
                                  Height="200"
                                  Width="300">
                                    <ContentPresenter />
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style.Setters>
            </Style>
        </GridView.ItemContainerStyle>
    </GridView>

谁能指出我如何创建不同大小的图块的正确方向,并且它们的大小不一样。我已经阅读了VariableSizedWrapGrid,但这是没有转移到 Windows 10 开发中的 Windows 8 功能吗?

更新

我已经尝试过了,但没有得到我想要的结果。它为我提供了与上面的 XAML 相同的布局。

<ItemsPanelTemplate>
     <VariableSizedWrapGrid Orientation="Horizontal"/>
</ItemsPanelTemplate>

【问题讨论】:

  • 你的意思是VariableSizedWrapGrid?是的,我很确定。甚至还有一些基于 GridView 的 stuff 我见过但从未使用过。
  • 好吧,试一试,如果它没有提供补救措施,请回来。
  • @ChrisW。我添加了上面的更新
  • 基于what的不同尺寸?
  • 我只是想要随机不同的尺寸......我真的不在乎在什么情况下它会变成不同的尺寸。

标签: c# xaml gridview grid


【解决方案1】:

如上所述,您需要为此使用VariableSizedWrapGrid

您仍然需要为每个图块分配 RowSpanColumnSpan。它们的默认值为“1”,这意味着它们都将具有相同的大小。

查看此详细示例,了解有关如何实现此目的的更多信息: http://blogs.msdn.com/b/walaa/archive/2014/02/23/gridview-amp-multiple-item-templates.aspx

编辑:另一种选择是这样做:

创建自己的 GridView:

public class VariableGridView : GridView
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        var gridViewSize = item as IGridViewSize;
        if (gridViewSize != null)
        {
            element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, gridViewSize.ColumnSpan);
            element.SetValue(VariableSizedWrapGrid.RowSpanProperty, gridViewSize.RowSpan);
        }

        base.PrepareContainerForItemOverride(element, item);
    }
}

IGridViewSize定义如下:

public interface IGridViewSize
{
    int ColumnSpan { get; }
    int RowSpan { get; }
}

在您的磁贴中实现此接口。在创建您的项目时,将您的(随机)值分配给它们的 ColumnSpanRowSpan。 (另一种选择是:忽略此接口,并在 VariableGridView.PrepareContainerForItemOverride 方法中分配您的随机大小。)

您可以这样使用VariableGridView

<controls:VariableGridView ItemsSource="{Binding MyItems}">
   <controls:VariableGridView.ItemsPanel>
      <ItemsPanelTemplate>
        <VariableSizedWrapGrid Orientation="Horizontal" />
      </ItemsPanelTemplate>
   </controls:VariableGridView.ItemsPanel>
</controls:VariableGridView>

【讨论】:

  • 我看不到这在我的情况下如何工作?我没有可以手动设置行/列跨度的硬编码数量的图块。我的 Tiles 是动态生成的,具体取决于我返回的列表中的对象数量......
  • @Code 您可以在HomeTemplateSelector 中添加随机化(在该示例中)。另一种选择是在每个平铺对象中定义RowSpanColumnSpan 属性,并创建一个自定义VariableSizedGridView 来获取这些跨度并将它们分配给正确的属性。我会用更多细节更新我的答案。
  • 您确定这适用于 Windows 10 应用程序吗?示例链接看起来像是用于开发 Windows 8 应用程序
  • @Code,是的,它适用于 W10,以及 W8 和 W8.1
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2018-05-28
相关资源
最近更新 更多