Dado um StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Qual é a melhor maneira de espaçar os elementos filhos para que haja intervalos de tamanho igual entre eles, mesmo que os elementos filhos sejam de tamanhos diferentes? Isso pode ser feito sem definir propriedades em cada um dos filhos individuais?
wpf
silverlight
xaml
stackpanel
GraemeF
fonte
fonte
Respostas:
Use Margem ou Preenchimento, aplicado ao escopo no contêiner:
EDIT: Caso deseje reutilizar a margem entre dois contêineres, é possível converter o valor da margem em um recurso em um escopo externo, fe
e, em seguida, consulte esse valor no escopo interno
fonte
Button
.Label
você tem que usarPadding
em vez deMargin
Outra boa abordagem pode ser vista aqui: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx O link está quebrado -> é o arquivo da web deste link.
Ele mostra como criar um comportamento anexado, para que uma sintaxe como esta funcione:
Essa é a maneira mais fácil e rápida de definir Margem para vários filhos de um painel, mesmo que não sejam do mesmo tipo. (Ou seja, botões, caixas de texto, caixas de combinação, etc.)
fonte
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
antes de realmente definir a margem da criança, ela permite especificar manualmente as margens de alguns elementos.Melhorei a resposta de Elad Katz .
Código fonte na essência .
Exemplo:
fonte
ItemsControl
vinculado a uma coleção em mudança. Ele assume que os itens são estáticos a partir do momento em que oLoad
evento do pai é acionado.O que você realmente deseja fazer é agrupar todos os elementos filhos. Nesse caso, você deve usar um controle de itens e não recorrer a propriedades anexas horríveis, das quais você acabará tendo um milhão para todas as propriedades que deseja estilizar.
fonte
Margin="0 0 -5 0"
) também contraria o espaçamento após o último item da lista.+1 para a resposta de Sergey. E se você quiser aplicar isso a todos os seus StackPanels, poderá fazer o seguinte:
Mas cuidado: se você definir um estilo como este no seu App.xaml (ou outro dicionário que seja mesclado no Application.Resources), ele poderá substituir o estilo padrão do controle. Para controles quase sem aparência, como o stackpanel, não é um problema, mas para caixas de texto, etc., você pode se deparar com esse problema , que felizmente tem algumas soluções alternativas.
fonte
Seguindo a sugestão de Sergey, você pode definir e reutilizar um estilo inteiro (com vários configuradores de propriedades, incluindo Margem) em vez de apenas um objeto Thickness:
...
Observe que o truque aqui é o uso de Herança de estilo para o estilo implícito, herdado do estilo em algum dicionário de recursos externo (provavelmente mesclado de arquivo XAML externo).
Nota:
Inicialmente, tentei ingenuamente usar o estilo implícito para definir a propriedade Style do controle para esse recurso externo de estilo (digamos, definido com a chave "MyStyle"):
que causou o encerramento do Visual Studio 2010 imediatamente com o erro CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)), conforme descrito em https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -com-falha-catastrófica-quando-um-estilo-tenta-definir-estilo-propriedade #
fonte
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing agora estão na visualização UWP, todos permitirão realizar melhor o que é solicitado aqui.
Atualmente, essas propriedades estão disponíveis apenas com o SDK do Windows 10 Fall Creators Update Insider, mas devem chegar aos bits finais!
fonte
O UniformGrid pode não estar disponível no Silverlight, mas alguém o transportou do WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
fonte
Minha abordagem herda o StackPanel.
Uso:
Tudo o que é necessário é a seguinte turma curta:
fonte
às vezes você precisa definir Padding, não Margin, para deixar espaço entre os itens menores que o padrão
fonte