Pergunta

Atualmente estou trabalhando com Panels 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top