Qual é a diferença entre largura eWidth no WPF?
-
03-07-2019 - |
Pergunta
Atualmente estou trabalhando com Panel
s em WPF, e eu notei que no que diz respeito ao Width
e Height
propriedades, também existem duas outras propriedades chamadas ActualWidth
e ActualHeight
.
ActualWidth
Recebe a largura renderizada desse elemento. Esta é uma propriedade de dependência. (Herdado da estrutura.)
Width
Recebe ou define a largura do elemento. Esta é uma propriedade de dependência. (Herdado da estrutura.)
Referência: Msdn
Alguém pode apontar as diferenças entre os dois e quando usar qualquer um?
Solução
Width
/Height
é o solicitado ou layout Tamanho. Se você definir como automático, o valor é double.NaN
Quando você acessa a propriedade no código atrás.
ActualWidth
/ActualHeight
é o renderizado Tamanho. Se você deseja/precisar do tamanho real do item, use este atributo.
Outras dicas
eu acho ActualWidth
Mais útil quando quero ligar a largura ou a altura de um elemento a outro.
Neste exemplo simples, tenho dois botões dispostos lado a lado e um comentário abaixo que é restrito à largura do Stackpanel que contém os dois botões.
<StackPanel>
<StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" >
<Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/>
<Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/>
</StackPanel>
<TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile."
Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/>
</StackPanel>
ActualWidth
contas para preenchimento no valor, então sempre que você precisar saber esse número que você pode ligar Actualwidth
em vez de largura e evitar o cálculo.
Editar: a margem removida B/C não faz parte da Weorwidth.
ActualWidth
é definido pelo sistema de renderização e pode ser diferente, dependendo das larguras de outros elementos e restrições gerais de tamanho. Como resultado, ele não pode ser alterado. Width
é uma propriedade que pode ser alterada e deve ser usada para aumentar ou diminuir a largura do elemento.
A partir de Msdn:
Esta propriedade é um valor calculado com base em outras entradas de largura e no sistema de layout. O valor é definido pelo próprio sistema de layout, com base em um passe real de renderização, e, portanto, pode ficar um pouco atrás do valor definido de propriedades, como
Width
que são a base da mudança de entrada.
Há uma razão muito boa não usar o ActualWidth
para se ligar a (obviamente ActualHeight
adequadamente). Quando você define o Width
de um elemento, para o ActualWidth
de outro que você pode quebrar a corrente de layout.
Na melhor das hipóteses, seu elemento/controle precisa ser analisado após o término do processo de layout do pai (a fonte de ligação). Isso significa tempo adicional. Se estiver no mesmo nível de hierarquia que o pai, o processo de layout precisa de duas execuções (pelo menos) para calcular um tamanho definitivo.
Por exemplo, eu tinha um controle que tinha sua propriedade de tamanho substituída em um estilo que o definiria para o TemplatedParent
(não faça):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
Ao redimensionar a janela contendo, o controle impediria que o contêiner se tornasse menor e freia o layout. Configurando -o para o Width
vai resolver o problema (Faz):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
Se você tiver que usar o ActualWidth
Em geral, algo está errado com seu xaml. Melhor consertar isso em vez de bagunçar os tamanhos finais da execução do layout.
É exatamente isso, a largura da renderização! = Largura do layout. Um pretende ser usado para layout, o outro destina -se à renderização. Como no WinForms, havia um tamanho e uma propriedade do cliente, a diferença um pouco e você deve usar o tamanho do atual/cliente da renderização e a largura/altura para o layout.
Você pode definir o Width
propriedade, mas não a ActualWidth
propriedade.
o Width
A propriedade é usada para determinar como o painel é renderizado, então o ActualWidth
está definido com a largura real usada. Isso pode não ser o mesmo valor que a largura, dependendo do tamanho de seus elementos filhos e constrições do elemento pai.
o ActualWidth
não está definido imediatamente ao definir o Width
propriedade, mas será atualizada (uma ou mais vezes) durante a renderização.