Я просто хочу, чтобы текст был слева, а окно справки - справа.
Окно справки должно доходить до самого дна.
Если вы возьмете наружу StackPanel
внизу, это будет прекрасно работать.
Но по причинам макета (я вставляю UserControls динамически) мне нужно иметь обертку StackPanel
.
Как получить GroupBox
расширение до нижней части StackPanel
, как вы можете видеть, я пытался:
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>
Ответ:
Спасибо Марк, используя DockPanel
вместо того, чтобы StackPanel
прояснить это. В общем, DockPanel
теперь я все больше и больше использую макет WPF, вот фиксированный 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
Эдвард Тангей
источник
источник
Ответы:
Похоже, вы хотите,
StackPanel
чтобы последний элемент занимал все оставшееся пространство. Но почему бы не использоватьDockPanel
? Украсьте другие элементы вDockPanel
withDockPanel.Dock="Top"
, и тогда ваш элемент управления справкой сможет заполнить оставшееся пространство.XAML:
Если вы находитесь на платформе без
DockPanel
доступных (например, WindowsStore), вы можете создать тот же эффект с сеткой. Вот приведенный выше пример, выполненный с использованием сетки:источник
Причина, по которой это происходит, заключается в том, что панель стека измеряет каждый дочерний элемент с положительной бесконечностью в качестве ограничения для оси, на которой он укладывает элементы. Дочерние элементы управления должны возвращать, насколько большим они хотят быть (положительная бесконечность не является действительным возвращением от MeasureOverride по любой из осей), поэтому они возвращают наименьший размер, где все будет соответствовать. У них нет возможности узнать, сколько места они действительно должны заполнить.
Если вашему представлению не нужна функция прокрутки и приведенный выше ответ не соответствует вашим потребностям, я бы предложил создать собственную панель. Вероятно, вы можете получить прямо из StackPanel, и тогда все, что вам нужно будет сделать, это изменить метод ArrangeOverride, чтобы он разделял оставшееся пространство между дочерними элементами (предоставляя им одинаковое количество дополнительного пространства). Элементы должны хорошо отображаться, если им дают больше места, чем они хотели, но если вы дадите им меньше, вы начнете видеть глюки.
Если вы хотите иметь возможность прокручивать все это, то я боюсь, что все будет немного сложнее, потому что ScrollViewer дает вам бесконечное количество пространства для работы, которое поставит вас в то же положение, что и дочерние элементы. первоначально. В этой ситуации вы можете захотеть создать новое свойство на новой панели, которое позволит вам указать размер области просмотра, вы должны иметь возможность привязать это к размеру ScrollViewer. В идеале вы должны реализовать IScrollInfo , но это становится сложным, если вы собираетесь реализовать все это правильно.
источник
Альтернативный метод - использовать Grid с одним столбцом и n строками. Установите высоту всех рядов
Auto
, а высоту самого нижнего ряда -1*
.Я предпочитаю этот метод, потому что я обнаружил, что гриды имеют лучшую производительность компоновки, чем DockPanels, StackPanels и WrapPanels. Но если вы не используете их в ItemTemplate (где макет выполняется для большого количества элементов), вы, вероятно, никогда не заметите.
источник
Вы можете использовать SpicyTaco.AutoGrid - модифицированную версию
StackPanel
:Первая кнопка будет заполнена.
Вы можете установить его через NuGet:
Я рекомендую взглянуть на SpicyTaco.AutoGrid . Это очень полезно для форм в WPF
DockPanel
,StackPanel
а такжеGrid
позволяет легко и изящно решить проблему растяжения. Просто посмотрите на readme на GitHub.источник