Alguns controles WPF (como o Button
) parecem consumir todo o espaço disponível em seu contêiner, se você não especificar a altura que ele deve ter.
E alguns, como os que eu preciso usar agora, os (multilinhas) TextBox
e os ListBox
parecem mais preocupados em apenas ocupar o espaço necessário para ajustar seu conteúdo, e não mais.
Se você colocar esses caras em uma célula em um UniformGrid
, eles serão expandidos para caber no espaço disponível. No entanto, as UniformGrid
instâncias não são adequadas para todas as situações. E se você tiver uma grade com algumas linhas definidas como * height para dividir a altura entre si e outras * linhas? E se você tiver um StackPanel
e você tiver um Label
, um List
e um Button
, como conseguir que a lista ocupe todo o espaço não consumido pelo rótulo e pelo botão?
Eu acho que isso seria realmente um requisito básico de layout, mas não consigo descobrir como fazê-los preencher o espaço que eles poderiam (colocá-los em DockPanel
e defini-los para preencher também não funciona, ao que parece, pois o DockPanel
único ocupa o espaço necessário para seus 'subcontroles).
A GUI redimensionável seria muito horrível se você tivesse que jogar com Height
, Width
, MinHeight
, MinWidth
etc.
Você pode vincular suas propriedades Height
e Width
à célula da grade que ocupa? Ou existe outra maneira de fazer isso?
fonte
Respostas:
Cada controle derivado
Panel
implementa uma lógica de layout distinta executada emMeasure()
eArrange()
:Measure()
determina o tamanho do painel e cada um de seus filhosArrange()
determina o retângulo onde cada controle é processadoO último filho do
DockPanel
preenche o espaço restante. Você pode desativar esse comportamento, definindo aLastChild
propriedade comofalse
.Ele
StackPanel
pede a cada criança o tamanho desejado e as empilha. O painel da pilha chamaMeasure()
cada criança, com um tamanho disponível deInfinity
e, em seguida, usa o tamanho desejado da criança.A
Grid
ocupa todo o espaço disponível, no entanto, ele definirá cada criança para o tamanho desejado e as centralizará na célula.Você pode implementar sua própria lógica de layout, derivando
Panel
e substituindoMeasureOverride()
eArrangeOverride()
.Veja este artigo para um exemplo simples.
fonte
The last child of the DockPanel fills the remaining space
: esta foi a chave que faltava ao meu entendimento. Sempre achei que o elemento sem Dock explícito preenchia o espaço.Também há algumas propriedades que você pode definir para forçar um controle a preencher seu espaço disponível quando, caso contrário, não o faria. Por exemplo, você pode dizer:
... para forçar o conteúdo de um controle a esticar horizontalmente. Ou você pode dizer:
... forçar o próprio controle a esticar horizontalmente para preencher seu pai.
fonte
Bem, eu mesmo descobri, logo após postar, qual é a maneira mais embaraçosa. :)
Parece que todos os membros de um StackPanel simplesmente preencherão o tamanho mínimo solicitado.
No DockPanel, encaixei as coisas na ordem errada. Se o TextBox ou o ListBox for o único item ancorado sem alinhamento, ou se eles forem os últimos adicionados, preencherão o espaço restante conforme desejado.
Eu adoraria ver um método mais elegante de lidar com isso, mas funcionará.
fonte
Use as propriedades de layout HorizontalAlignment e VerticalAlignment . Eles controlam como um elemento usa o espaço que tem dentro de seu pai quando há mais espaço disponível do que o exigido pelo elemento.
A largura de um StackPanel, por exemplo, será tão larga quanto o elemento mais largo que ele contém. Portanto, todos os elementos mais estreitos têm um pouco de espaço em excesso. As propriedades de alinhamento controlam o que o elemento filho faz com o espaço extra.
O valor padrão para ambas as propriedades é Stretch, portanto, o elemento filho é estendido para preencher todo o espaço disponível. As opções adicionais incluem Esquerda, Central e Direita para HorizontalAlignment e Superior, Central e Inferior para VerticalAlignment .
fonte