12

两者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测量第一个项目,然后用第一个项目的所需大小测量其余的孩子。

任何解决方法?

4

4 回答 4

3

您需要在每个 Rectangle 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>
于 2012-07-23T15:44:10.113 回答
0

要使用 VariableSizeWrapGrid,您应该创建自己的 GridView 自定义控件,PrepareContainerForItemOverride并在该方法内覆盖和设置元素 RowSpan 和 ColumnSpan。这样每个元素都有自己的高度/宽度。

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

于 2012-09-27T19:09:18.490 回答
0

今天设法解决了这个问题。您需要使用 WinRT XAML 工具包 ( http://winrtxamltoolkit.codeplex.com ) 中的 VisualTreeHelperExtension.cs。对我来说,我试图调整一个以 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() 为您的 ListView 找到主 WrapGrid 容器:

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;

于 2013-03-13T21:08:23.383 回答
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

于 2012-07-23T16:16:11.547 回答