2012-07-23 19 views
12

VariableSizedWrapGridWrapGridの両方とも、最初の項目に基づいてすべての子を測定します。VariableSizedWrapGridとWrapGridの子どものサイズの測定

このため、次の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対策の最初の項目のように思えるし、その後、残りの子供たちは、最初の1の所望の大きさで測定されています。

どのような回避策ですか?

答えて

3

あなたは、各長方形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> 
0

ITSは最善の方法ではないかもしれないが、これは私は、ItemHeightの値がTextBlockの

にバインドされている私の@MetroRSSReaderアプリ

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

お知らせでこれを行っていますか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; 
    } 

あなたは、あなた自身のGridViewのカスタムコントロールを作成し、PrepareContainerForItemOverrideをオーバーライドして、要素を設定する必要がありVariableSizeWrapGridを使用するには、完全なソースコードhttp://metrorssreader.codeplex.com/SourceControl/changeset/view/18233#265970

0

を閲覧することができますそのメソッド内のRowSpanおよびColumnSpanそうすれば、各要素は独自の高さ/幅を持ちます。ここで

はジェリー・ニクソンによってウォークスルー/素敵なチュートリアルです:今日は、このいずれかを把握するために管理 http://dotnet.dzone.com/articles/windows-8-beauty-tip-using

+1

任意のアイデアそのような行/列のスパンをどのように追加すれば、データが取得され、モデルが変更されたときに更新されます。 PrepareContainerForItemOverrideは変更に対して呼び出されません。 –

0

。 WinRT XAML Toolkit(http://winrtxamltoolkit.codeplex.com)でVisualTreeHelperExtension.csを使用する必要があります。私にとっては、GridViewをItemsPanelTemplateとして持つListViewを調整しようとしていましたが、同じコンセプトが適用されるはずです。

1)あなたは

_myList.LayoutUpdated += _myList_LayoutUpdated;

2)使用VisualTreeHelperExtensions.GetDescendantsOfType()を見つけるために)サイズを更新したいと思うとき、これは(あなたのListViewのLayoutUpdatedイベントにアタッチアイテムのデータテンプレートに共通の(ユニークな)要素タイプ(たとえば、幅が動的なTextBlock):

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)を使用すると、計算のmaxWidthにWrapGridのItemWidthを設定します。

wg.First().ItemWidth = maxWidth;

関連する問題