12

との両方VariableSizedWrapGridWrapGrid奇妙な測定があります - 最初の項目に基づいてすべての子を測定します。

そのため、次の XAML は 3 番目の項目をクリップします。

    <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 で添付プロパティを使用し、VariableSizeWrapGrid に ItemHeight および ItemWidth を追加する必要があります。

<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

今日これを理解することができました。WinRT XAMLツールキット( http://winrtxamltoolkit.codeplex.com )のVisualTreeHelperExtension.csを利用する必要があります。私の場合、ItemsPanelTemplateとしてGridViewを持つ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

VariableSizeWrapGrid を使用するには、独自の GridView カスタム コントロールを作成し、PrepareContainerForItemOverrideそのメソッド内で RowSpan 要素と ColumnSpan 要素をオーバーライドして設定する必要があります。そうすれば、各要素には独自の高さ/幅があります。

これは、Jerry Nixon による素晴らしいチュートリアル/ウォークスルーです: http://dotnet.dzone.com/articles/windows-8-beauty-tip-using

于 2012-09-27T19:09:18.490 に答える
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 に答える