Ich möchte einfach links fließenden Text und rechts ein Hilfefeld.
Das Hilfefeld sollte sich bis ganz nach unten erstrecken.
Wenn Sie das Äußere StackPanel
unten herausnehmen, funktioniert es großartig.
Aber aus Gründen des Layouts (ich füge UserControls dynamisch ein) muss ich die Umhüllung haben StackPanel
.
Wie kann ich das erreichen GroupBox
, um bis zum Boden des zu reichen StackPanel
, wie Sie sehen können, habe ich versucht:
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>
Antworten:
Danke Mark, benutze es DockPanel
anstatt StackPanel
es zu klären. Im Allgemeinen verwende ich DockPanel
jetzt immer mehr WPF-Layouts. Hier ist die feste 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
quelle
quelle
Antworten:
Es hört sich so an, als ob Sie eine möchten,
StackPanel
bei der das letzte Element den gesamten verbleibenden Platz belegt. Aber warum nicht einDockPanel
? Dekorieren Sie die anderen Elemente imDockPanel
mitDockPanel.Dock="Top"
, und dann kann Ihre Hilfesteuerung den verbleibenden Platz ausfüllen.XAML:
Wenn Sie sich auf einer Plattform befinden, die nicht
DockPanel
verfügbar ist (z. B. WindowsStore), können Sie denselben Effekt mit einem Raster erstellen. Hier ist das obige Beispiel, das stattdessen mit Gittern erstellt wurde:quelle
Der Grund dafür ist, dass das Stapelfenster jedes untergeordnete Element mit positiver Unendlichkeit als Einschränkung für die Achse misst, entlang der es Elemente stapelt. Die untergeordneten Steuerelemente müssen zurückgeben, wie groß sie sein möchten (positive Unendlichkeit ist keine gültige Rückgabe von MeasureOverride in beiden Achsen), damit sie die kleinste Größe zurückgeben, in die alles passt. Sie können nicht wissen, wie viel Platz sie wirklich füllen müssen.
Wenn Ihre Ansicht keine Bildlauffunktion benötigt und die obige Antwort nicht Ihren Anforderungen entspricht, würde ich vorschlagen, ein eigenes Panel zu implementieren. Sie können wahrscheinlich direkt von StackPanel ableiten. Anschließend müssen Sie lediglich die ArrangeOverride- Methode so ändern , dass der verbleibende Speicherplatz auf die untergeordneten Elemente aufgeteilt wird (wobei jeder den gleichen zusätzlichen Speicherplatz erhält ). Elemente sollten gut gerendert werden, wenn ihnen mehr Platz eingeräumt wird als gewünscht. Wenn Sie ihnen jedoch weniger Platz geben, werden Sie Störungen sehen.
Wenn Sie in der Lage sein möchten, das Ganze zu scrollen, werden die Dinge leider etwas schwieriger, da der ScrollViewer Ihnen unendlich viel Platz zum Arbeiten bietet, wodurch Sie in die gleiche Position gebracht werden wie die untergeordneten Elemente ursprünglich. In dieser Situation möchten Sie möglicherweise eine neue Eigenschaft in Ihrem neuen Bedienfeld erstellen, mit der Sie die Größe des Ansichtsfensters angeben können. Sie sollten diese an die Größe des ScrollViewer binden können. Idealerweise würden Sie IScrollInfo implementieren , aber das wird kompliziert, wenn Sie alles richtig implementieren.
quelle
Eine alternative Methode besteht darin, ein Raster mit einer Spalte und n Zeilen zu verwenden. Stellen Sie alle Zeilenhöhen auf
Auto
und die unterste Zeilenhöhe auf ein1*
.Ich bevorzuge diese Methode, da ich festgestellt habe, dass Grids eine bessere Layoutleistung aufweisen als DockPanels, StackPanels und WrapPanels. Aber wenn Sie sie nicht in einer ItemTemplate verwenden (wo das Layout für eine große Anzahl von Elementen ausgeführt wird), werden Sie es wahrscheinlich nie bemerken.
quelle
Sie können SpicyTaco.AutoGrid verwenden - eine modifizierte Version von
StackPanel
:Die erste Schaltfläche wird ausgefüllt.
Sie können es über NuGet installieren:
Ich empfehle einen Blick auf SpicyTaco.AutoGrid . Es ist sehr nützlich für Formulare in WPF statt
DockPanel
,StackPanel
undGrid
und löst Problem mit Strecken sehr einfach und elegant. Schauen Sie sich einfach die Readme-Datei auf GitHub an.quelle