Digamos que eu queira TextBlock
que seja Width
igual ao contêiner pai Width
(ou seja, estique de um lado para o outro) ou uma porcentagem do contêiner pai Width
, como posso fazer isso XAML
sem especificar valores absolutos?
Eu quero fazer isso para que, se o contêiner pai Container for expandido posteriormente (seu ' Width
aumentado), seus' elementos filho também serão expandidos automaticamente. (basicamente, como em HTML e CSS)
Respostas:
A maneira de esticá-lo para o mesmo tamanho que o contêiner pai é usar o atributo:
Isso fará o elemento Textbox esticar horizontalmente e preencher todo o espaço pai horizontalmente (na verdade, depende do painel pai que você está usando, mas deve funcionar na maioria dos casos).
As porcentagens só podem ser usadas com os valores das células da grade; portanto, outra opção é criar uma grade e colocar sua caixa de texto em uma das células com a porcentagem apropriada.
fonte
Você pode colocar as caixas de texto dentro de uma grade para fazer valores percentuais nas linhas ou colunas da grade e deixar que as caixas de texto sejam preenchidas automaticamente nas células-pai (como serão por padrão). Exemplo:
Isso tornará # 1 2/5 da largura e # 2 3/5.
fonte
Normalmente, você usaria um controle de layout interno apropriado para o seu cenário (por exemplo, use uma grade como pai, se desejar dimensionar em relação ao pai). Se você quiser fazer isso com um elemento pai arbitrário, poderá criar um ValueConverter, mas provavelmente não será tão limpo quanto você gostaria. No entanto, se você absolutamente precisar, poderá fazer algo assim:
Que pode ser usado assim, para obter uma caixa de texto filho com 10% da largura da tela pai:
fonte
CultureInfo.InvariantCulture
a possibilidade de adicionar à conversão dupla, pois aparameter
é considerada comostring
e em culturas com diferentesdecimal separator
ela não funcionará conforme o esperado.Para quem está recebendo um erro como: '2 *' a string não pode ser convertida em Length.
fonte
<RowDefinition Height="auto" />
?A implementação IValueConverter pode ser usada. A classe de conversor que recebe herança de IValueConverter usa alguns parâmetros como
value
(porcentagem) eparameter
(largura dos pais) e retorna o valor da largura desejada. No arquivo XAML, a largura do componente é definida com a desejada com o valor:XAML:
fonte
Eu sei que não é Xaml, mas fiz o mesmo com o evento SizeChanged da caixa de texto:
A caixa de texto parece ter 80% do tamanho de sua matriz (a margem do lado direito é de 20%) e se estende quando necessário.
fonte
Eu uso dois métodos para dimensionamento relativo. Eu tenho uma classe chamada
Relative
com três propriedades anexadasTo
,WidthPercent
eHeightPercent
que é útil se eu quiser que um elemento seja do tamanho relativo de um elemento em qualquer lugar da árvore visual e parecer menos invasivo que a abordagem do conversor - embora use o que funciona melhor para você estou feliz com.A outra abordagem é bastante mais esperta. Adicione um
ViewBox
local em que deseja tamanhos relativos e, dentro dele, adicione umGrid
na largura 100. Em seguida, se você adicionar umTextBlock
com largura 10, é obviamente 10% de 100.Ele
ViewBox
será dimensionado deGrid
acordo com o espaço fornecido, portanto, se for a única coisa na página,Grid
será dimensionado para toda a largura e, efetivamente, vocêTextBlock
será dimensionado para 10% da página.Se você não definir uma altura no
Grid
, ela diminuirá para se ajustar ao seu conteúdo, de modo que tudo será relativamente pequeno. Você terá que garantir que o conteúdo não fique muito alto, ou seja, comece a alterar a proporção do espaço fornecido, casoViewBox
contrário, começará a dimensionar a altura também. Provavelmente, você pode contornar isso com umStretch
deUniformToFill
.fonte