2012-07-23 14 views
12

Hem VariableSizedWrapGrid ve WrapGrid hem de garip ölçülere sahiptir - tüm öğeleri ilk öğeye göre ölçer.VariableSizedWrapGrid ve WrapGrid çocuk boyutu ölçümleri

Bundan dolayı, aşağıdaki XAML üçüncü öğeyi kırpacaktır.

<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 önlemlerin ilk madde ve sonra geri kalan çocuklar İlki istenen boyutu ile ölçülür gibi görünüyor.

Herhangi bir geçici çözüm var mı?

cevap

3

Her Dikdörtgen VariableSizeWrapGrid.ColumnSpan ve VariableSizeWrapGrid.RowSpan üzerinde Ekli Özellikler 'kullanmak yanı sıra VariableSizeWrapGrid için ItemHeight ve ItemWidth bir eklemem gerekiyor:

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

Onun olabilir değil en iyi yolu ama bu benim @MetroRSSReader app

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

Bildirimi yapmış nasıl ItemHeight değeri TextBlock

bağlıdır LayoutAwarePage.cs ayarlanır

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

     return itemHeight; 
    } 

Sen kendi GridView özel denetim oluşturmak ve PrepareContainerForItemOverride geçersiz kılmak ve unsurları belirlesin bir VariableSizeWrapGrid kullanmak için tam kaynak kodu http://metrorssreader.codeplex.com/SourceControl/changeset/view/18233#265970

0

göz atabilir Bu yöntem içinde RowSpan ve ColumnSpan. Bu şekilde her elemanın kendi yüksekliği/genişliği olacaktır. İşte

Jerry Nixon tarafından yürüyelim/öğretici güzel: bugün bu bir anlamaya Yönetilen http://dotnet.dzone.com/articles/windows-8-beauty-tip-using

+1

Böyle bir satır ekleyemez nasıl satır/col yayılır ve model değiştiğinde güncelleştirilir. PrepareContainerForItemOverride değişikliklere çağrılmaz. –

0

. WinRT XAML Toolkit'te (http://winrtxamltoolkit.codeplex.com) VisualTreeHelperExtension.cs kullanılmalıdır. Benim için bir GridView'in ItemsPanelTemplate'i olduğu bir ListView'i ayarlamaya çalışıyordum, aynı konsept sizin için de geçerli.

1)

_myList.LayoutUpdated += _myList_LayoutUpdated;

2) Kullanım VisualTreeHelperExtensions.GetDescendantsOfType() bulmak için) boyutları güncellemek istersiniz zaman bu (sizin ListView'in LayoutUpdated olayına takın (: genişlik dinamiktir TextBlock ex): en öğenin veri şablonunda bir ortak (ve benzersiz) eleman tip

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

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

3) bulunan kalemlerin maksimum genişliğini alın:

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

4) VisualTreeHelperExtensions kullanın.GetDescendantsOfType() sizin ListView ana WrapGrid kabını bulmak için:

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

5) MaxWidth için WrapGrid en ItemWidth ayarlayın hesaplanan: Bir fikrin

wg.First().ItemWidth = maxWidth;