2015-11-30 121 views
0

我現在有一個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 8的功能沒有轉移到Windows 10開發中嗎?

更新

我已經試過這一點,我沒有得到我一直在尋找的結果。它給了我與我上面的XAML一樣的佈局。

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

你的意思[VariableSizedWrapGrid(https://開頭msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.variablesizedwrapgrid)?是的,我很確定。甚至還有一些基於GridView控件[東東](https://visualstudiogallery.msdn.microsoft.com/da65cc08-c4bf-4824-b483-9c8f53fb063c)我見過但從未使用過。 –

+0

是的,我的錯誤。 – Code

+0

好吧,如果它沒有提供補救措施,那就給它一個鏡頭,然後回來。 –

回答

0

如上所述,您需要爲此使用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> 
+0

我無法看到如何在我的情況下工作?我沒有硬編碼的瓷磚量,我可以手動設置行/列。我的瓷磚是動態生成的,具體取決於返回列表中的對象數量。 – Code

+0

@Code您可以在'HomeTemplateSelector'(在該示例中)中添加隨機數。另一種選擇是在每個tile對象中定義一個'RowSpan'和'ColumnSpan'屬性,並創建一個自定義的'VariableSizedGridView'來抓取這些跨度並將它們分配給正確的屬性。我會更詳細地更新我的答案。 –

+0

您確定這適用於Windows 10應用程序嗎?該示例鏈接看起來像是用於開發Windows 8應用程序 – Code