Eu simplesmente quero texto corrido à esquerda e uma caixa de ajuda à direita.
A caixa de ajuda deve se estender até o fim.
Se você tirar o exterior StackPanel
abaixo, ele funciona muito bem.
Mas, por razões de layout (estou inserindo UserControls dinamicamente), preciso ter o empacotamento StackPanel
.
Como faço GroupBox
para estender até a parte inferior do StackPanel
, como você pode ver, eu tentei:
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>
Responda:
Obrigado Mark, usando em DockPanel
vez de StackPanel
esclarecer. Em geral, eu me vejo usando DockPanel
cada vez mais agora o layout do WPF, aqui está o XAML fixo:
<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
fonte
fonte
Respostas:
Parece que você deseja um local
StackPanel
onde o elemento final consome todo o espaço restante. Mas por que não usar umDockPanel
? Decore os outros elementosDockPanel
comDockPanel.Dock="Top"
, e seu controle de ajuda poderá preencher o espaço restante.XAML:
Se você estiver em uma plataforma sem
DockPanel
disponibilidade (por exemplo, WindowsStore), poderá criar o mesmo efeito com uma grade. Aqui está o exemplo acima realizado usando grades:fonte
A razão pela qual isso está acontecendo é porque o painel de pilha mede cada elemento filho com infinito positivo como a restrição para o eixo no qual está empilhando elementos. Os controles filho precisam retornar o tamanho que desejam (o infinito positivo não é um retorno válido do MeasureOverride nos dois eixos) para que eles retornem o menor tamanho em que tudo caiba. Eles não têm como saber quanto espaço realmente precisam preencher.
Se sua visualização não precisar ter um recurso de rolagem e a resposta acima não atender às suas necessidades, sugiro que implemente seu próprio painel. Provavelmente você pode derivar diretamente do StackPanel e, em seguida, tudo o que você precisa fazer é alterar o ArrangeOverride método para que ele divida o espaço restante entre seus elementos filhos (dando a cada um a mesma quantidade de espaço extra). Os elementos devem ficar bem se receberem mais espaço do que desejavam, mas se você der menos, começará a ver falhas.
Se você quiser rolar a coisa toda, receio que as coisas sejam um pouco mais difíceis, porque o ScrollViewer oferece uma quantidade infinita de espaço para trabalhar, o que o colocará na mesma posição que os elementos filhos. originalmente. Nessa situação, convém criar uma nova propriedade em seu novo painel, que permita especificar o tamanho da porta de visualização; você poderá vincular isso ao tamanho do ScrollViewer. Idealmente, você implementaria o IScrollInfo , mas isso começará a ficar complicado se você implementar tudo corretamente.
fonte
Um método alternativo é usar uma grade com uma coluna e n linhas. Defina todas as alturas das linhas como
Auto
e a altura mais inferior da linha como1*
.Prefiro esse método porque descobri que o Grids tem melhor desempenho de layout que o DockPanels, StackPanels e WrapPanels. Mas, a menos que você os esteja usando em um ItemTemplate (onde o layout está sendo executado para um grande número de itens), você provavelmente nunca perceberá.
fonte
Você pode usar o SpicyTaco.AutoGrid - uma versão modificada de
StackPanel
:O primeiro botão será preenchido.
Você pode instalá-lo via NuGet:
Eu recomendo dar uma olhada no SpicyTaco.AutoGrid . É muito útil para formulários em WPF em vez de
DockPanel
,StackPanel
eGrid
e resolver o problema com alongamento muito fácil e graciosamente. Basta ler o leia-me no GitHub.fonte