Zachowanie szukasz jest domyślny zachowanie WrapPanel
jak widać na poniższym przykładzie.
<WrapPanel >
<WrapPanel.Resources>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Width"
Value="80" />
<Setter Property="Height"
Value="80" />
<Setter Property="Margin"
Value="3" />
<Setter Property="Fill"
Value="#4DB4DD" />
</Style>
</WrapPanel.Resources>
<Rectangle Width="150" />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="200"/>
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="220"/>
<Rectangle />
<Rectangle />
</WrapPanel>
która produkuje następujący wynik:
Jak widać, szerokość każdego elementu jest honorowane.
Twój problem jest spowodowany przez ustawienie orientacji szablonu WrapPanel
na Vertical
. Jest to układanie elementów od góry do dołu, a nie od lewej do prawej, co oznacza, że jest to właściwość Height
, którą musisz ustawić (lub możesz powrócić do układu poziomego, jak w moim przykładzie).
Porównaj dane wyjściowe z moim zrzutem ekranu, gdy panel jest ustawiony poziomo; każdy wiersz wiersz jest rozmiarem najwyższego . Nie wierz mi? Spróbuj ustawić jedną z właściwości na większą wartość, a zauważysz, że rozmiar wiersza wzrośnie, a linia Rectangles
nie będzie już ustawiona pionowo.
Czytając komentarze Myślę, że najlepszym sposobem, aby zacząć, to należy wykonać następujące czynności:
- Mają
WrapPanel
znoszącej swoją zawartość poziomo.
- Przedmioty powinny mieć jednolity wzór:
Height
.
- Ograniczenie
Height
z WrapPanel
do określonego rozmiaru, aby nie uzyskać pionowych pasków przewijania.
Wysokość swój WrapPanel
powinny być opracowane za pomocą następującego wzoru:
((Wysokość elementu + Top Margines dolny margines) x liczba rzędów))
Szerokość każdego elementu również wymaga trochę przemyśleń, aby panel ułożył przedmioty poziomo, tak jak interfejs metra (w kolejce, zamiast przestawiać).
Dostępne są dwa rozmiary płytek; mały ma szerokość 80 pikseli, a duży ma szerokość 166 pikseli. Szerokość dużej płytki przerabia się tak:
(szerokość poz * 2) + (lewy + prawy margines margines)
Gwarantuje płytki kolejce poprawnie.
Więc teraz mój XAML wygląda mniej więcej tak:
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Disabled">
<StackPanel Orientation="Horizontal"
Margin="10,0">
<StackPanel.Resources>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Width"
Value="80" />
<Setter Property="Height"
Value="80" />
<Setter Property="Margin"
Value="3" />
<Setter Property="Fill"
Value="#4DB4DD" />
</Style>
<Style TargetType="{x:Type WrapPanel}">
<Setter Property="Margin"
Value="0,0,25,0" />
<Setter Property="MaxWidth"
Value="516" />
</Style>
</StackPanel.Resources>
<WrapPanel Height="258">
<Rectangle Width="166" />
<Rectangle />
<Rectangle Width="166" />
<Rectangle />
<Rectangle Width="166" />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="166" />
<Rectangle />
</WrapPanel>
<WrapPanel Height="258">
<Rectangle />
<Rectangle Width="166" />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="166" />
<Rectangle />
</WrapPanel>
</StackPanel>
</ScrollViewer>
która produkuje następujący wynik:
To powinno dać wystarczająco dużo informacji, aby uruchomić ponownie czynnik to do pełna kontrola. Jeśli to zrobisz, wtedy należy pamiętać o następujących kwestiach:
- właściwości układu (mały rozmiar elementu, duży rozmiar elementu, szczelin itp) powinny być obliczone zamiast zakodowanego tak, że jeśli chcesz zmienić, na przykład, marginesy, układ nadal będzie działał poprawnie (IE płytki będą nadal wyrównane).
- Chciałbym ograniczyć liczbę "płytek", które można wyświetlić (w bieżącym przykładzie, jeśli płytki nie mieszczą się w układzie, są po prostu ukryte, co prawdopodobnie nie jest tym, czego potrzebujesz).
Jestem prawie pewien, że możesz ustawić różne wysokości/szerokości obiektów w "WrapPanel" - Zobacz [tutaj] (http://www.codeproject.com/Articles/30904/WPF-Layouts-A- Visual-Quick-Start) na przykład. Czy robisz coś w rodzaju 'WrapPanel' wewnątrz' ItemsControl'? Jeśli tak, musisz ustawić Wysokość/Szerokość w "ItemContainerStyle", a nie na samym elemencie (patrz na dole [tego artykułu] (http://rachel53461.wordpress.com/2011/09/17/wpf- itemscontrol-example /) dla przykładu/wyjaśnienia) – Rachel
Dzięki za wskaźnik i tak, używam 'WrapPanel' wewnątrz' ItemsControl'. Domyślam się, że coś innego jest przyczyną problemu. –
Jeśli umieszczenie "Wysokość"/"Szerokość" w "ItemContainerStyle" nie działa, czy możesz zaktualizować swoje pytanie za pomocą swojego kodu XAML? – Rachel