2012-07-23 94 views
12

VariableSizedWrapGridWrapGrid都有奇怪的测量 - 他们根据第一项测量所有孩子。VariableSizedWrapGrid和WrapGrid儿童尺寸的测量

因此,以下XAML将剪切第三项。

<VariableSizedWrapGrid Orientation="Horizontal"> 
     <Rectangle Width="50" Height="100" Margin="5" Fill="Blue" /> 
     <Rectangle Width="50" Height="50" Margin="5" Fill="Red" /> 
     <Rectangle Width="50" Height="150" Margin="5" Fill="Green" /> 
     <Rectangle Width="50" Height="50" Margin="5" Fill="Red" /> 
     <Rectangle Width="50" Height="100" Margin="5" Fill="Red" /> 
    </VariableSizedWrapGrid> 

好像VariableSizedWrapGrid措施中的第一项,然后将其余的儿童与第一个的期望的尺寸进行测定。

任何解决方法?

回答

3

您需要使用每个矩形VariableSizeWrapGrid.ColumnSpan和VariableSizeWrapGrid.RowSpan的附加属性以及添加ItemHeight和ItemWidth到VariableSizeWrapGrid:

<VariableSizedWrapGrid Orientation="Horizontal" ItemHeight="50" ItemWidth="50"> 
    <Rectangle 
     VariableSizedWrapGrid.ColumnSpan="1" 
     VariableSizedWrapGrid.RowSpan="2" 
     Width="50" Height="100" Margin="5" Fill="Blue" /> 
</VariableSizedWrapGrid> 
0

它可能不是最好的方式,但是这是如何我做这在我的@MetroRSSReader应用

<common:VariableGridView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VariableSizedWrapGrid ItemWidth="225" 
              ItemHeight="{Binding ElementName=bounds, Path=Text}" 
              MaximumRowsOrColumns="5" Orientation="Vertical" 
              /> 
       </ItemsPanelTemplate> 
       </common:VariableGridView.ItemsPanel> 
     </common:VariableGridView> 

通知的ItemHeight值绑定到一个TextBlock

<TextBlock x:Name="bounds" Grid.Row="1" Margin="316,8,0,33" Visibility="Collapsed"/> 

这是在LayoutAwarePage.cs设置

public string Fix_item_height_for_current_screen_resolution() 
    { 
     var screenheight = CoreWindow.GetForCurrentThread().Bounds.Height; 
     var itemHeight = screenheight < 1000 ? "100" : "140"; 

     return itemHeight; 
    } 

您可以浏览完整的源代码http://metrorssreader.codeplex.com/SourceControl/changeset/view/18233#265970

0

要使用VariableSizeWrapGrid你应该创建自己的GridView自定义控件并重写PrepareContainerForItemOverride并设置元素该方法中的RowSpan和ColumnSpan。这样每个元素将有它自己的高度/宽度。

这里是一个很好的教程/杰里·尼克松穿行:http://dotnet.dzone.com/articles/windows-8-beauty-tip-using

+1

任何想法如何添加这样的行/列跨度可以在模型更改时获得数据绑定和更新。 PrepareContainerForItemOverride不会在更改上调用。 – 2012-11-19 19:43:57

0

托管今天推测这一个。您需要使用WinRT XAML Toolkit中的VisualTreeHelperExtension.cs(http://winrtxamltoolkit.codeplex.com)。对我来说,我试图调整一个有GridView作为其ItemsPanelTemplate的ListView,这个概念应该适用于你。

1)安装到您的ListView的LayoutUpdated事件(这是当你将要更新的大小)

_myList.LayoutUpdated += _myList_LayoutUpdated;

2)使用VisualTreeHelperExtensions.GetDescendantsOfType()找到您的项目的数据模板中的常见(和唯一)元素类型(例如:宽度为动态的TextBlock):

var items = VisualTreeHelperExtensions.GetDescendantsOfType<TextBlock>(_myList); 

if (items == null || items.Count() == 0) 
    return; 

3)获取发现项目的最大宽度:

double maxWidth = items.Max(i => i.ActualWidth) + 8;

4)使用VisualTreeHelperExtensions。GetDescendantsOfType()找到主WrapGrid容器为您的ListView:

var wg = _categoryList.GetDescendantsOfType<WrapGrid>(); 
if (wg == null || wg.Count() != 1) 
    throw new InvalidOperationException("Couldn't find main ListView container"); 

5)设置WrapGrid的ItemWidth到maxWidth你计算:

wg.First().ItemWidth = maxWidth;