Chcę po prostu tekst ciągły po lewej stronie i pole pomocy po prawej stronie.
Pole pomocy powinno sięgać do samego dołu.
Jeśli wyjmiesz zewnętrzną część StackPanel
poniżej, działa to świetnie.
Ale ze względu na układ (dynamicznie wstawiam UserControls) muszę mieć opakowanie StackPanel
.
Jak mogę GroupBox
rozciągnąć do dołu StackPanel
, jak widać, próbowałem:
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto"
XAML:
<Window x:Class="TestDynamic033.Test3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test3" Height="300" Width="600">
<StackPanel
VerticalAlignment="Stretch"
Height="Auto">
<DockPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
Margin="10">
<GroupBox
DockPanel.Dock="Right"
Header="Help"
Width="100"
Background="Beige"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto">
<TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" />
</GroupBox>
<StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
<TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
</StackPanel>
</DockPanel>
</StackPanel>
</Window>
Odpowiedź:
Dzięki Mark, używając DockPanel
zamiast StackPanel
wyczyścić to. Ogólnie rzecz biorąc, DockPanel
coraz częściej używam teraz do układania WPF, oto naprawiony XAML:
<Window x:Class="TestDynamic033.Test3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test3" Height="300" Width="600" MinWidth="500" MinHeight="200">
<DockPanel
VerticalAlignment="Stretch"
Height="Auto">
<DockPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
MinWidth="400"
Margin="10">
<GroupBox
DockPanel.Dock="Right"
Header="Help"
Width="100"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto">
<Border CornerRadius="3" Background="Beige">
<TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap"
Padding="5"/>
</Border>
</GroupBox>
<StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
<TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
</StackPanel>
</DockPanel>
</DockPanel>
</Window>
wpf
xaml
autolayout
autoresize
dockpanel
Edward Tanguay
źródło
źródło
Odpowiedzi:
Wygląda na to, że chcesz, aby
StackPanel
ostatni element zużył całą pozostałą przestrzeń. Ale dlaczego nie użyćDockPanel
? Udekoruj pozostałe elementy zaDockPanel
pomocąDockPanel.Dock="Top"
, a następnie twoja kontrola pomocy może wypełnić pozostałe miejsce.XAML:
Jeśli korzystasz z platformy, która nie jest
DockPanel
dostępna (np. WindowsStore), możesz stworzyć ten sam efekt za pomocą siatki. Oto powyższy przykład zrealizowany za pomocą siatek:źródło
Dzieje się tak dlatego, że panel stosu mierzy każdy element potomny z dodatnią nieskończonością jako ograniczenie dla osi, na której układa elementy. Kontrolki potomne muszą zwracać, jak duże chcą być (dodatnia nieskończoność nie jest prawidłowym powrotem z MeasureOverride w obu osiach), więc zwracają najmniejszy rozmiar, w którym wszystko się zmieści. Nie mają możliwości dowiedzenia się, ile miejsca naprawdę muszą wypełnić.
Jeśli twój widok nie musi mieć funkcji przewijania, a powyższa odpowiedź nie odpowiada Twoim potrzebom, sugeruję wdrożenie własnego panelu. Prawdopodobnie możesz wywodzić bezpośrednio ze StackPanel, a następnie wszystko, co musisz zrobić, to zmienić metodę ArrangeOverride , tak aby dzieliła pozostałe miejsce między elementy potomne (dając im taką samą ilość dodatkowego miejsca). Elementy powinny dobrze renderować, jeśli mają więcej miejsca, niż chcą, ale jeśli dasz im mniej, zaczniesz zauważać usterki.
Jeśli chcesz móc przewijać całość, obawiam się, że będzie to nieco trudniejsze, ponieważ ScrollViewer daje ci nieskończoną ilość miejsca do pracy, dzięki czemu będziesz w tej samej pozycji, w jakiej były elementy potomne pierwotnie. W tej sytuacji możesz chcieć utworzyć nową właściwość w nowym panelu, która pozwala określić rozmiar rzutni, powinieneś być w stanie powiązać to z rozmiarem ScrollViewera. Idealnie byłoby zaimplementować IScrollInfo , ale zaczyna się komplikować, jeśli zamierzasz zaimplementować wszystko poprawnie.
źródło
Alternatywną metodą jest użycie siatki z jednej kolumny, a n rzędów. Ustaw wszystkie wysokości wierszy na
Auto
, a najniższą wysokość wiersza na1*
.Wolę tę metodę, ponieważ odkryłem, że siatki mają lepszą wydajność układu niż DockPanels, StackPanels i WrapPanels. Ale chyba, że używasz ich w ItemTemplate (gdzie układ jest wykonywany dla dużej liczby elementów), prawdopodobnie nigdy tego nie zauważysz.
źródło
Możesz użyć SpicyTaco.AutoGrid - zmodyfikowanej wersji
StackPanel
:Pierwszy przycisk będzie wypełniony.
Możesz zainstalować go za pomocą NuGet:
Polecam rzucić okiem na SpicyTaco.AutoGrid . Jest to bardzo przydatne w przypadku formularzy w WPF zamiast
DockPanel
,StackPanel
aGrid
i rozwiązywać problemy z rozciąganiem bardzo łatwo i bezpiecznie. Wystarczy spojrzeć na plik readme na GitHub.źródło