Question

Je travaille actuellement avec les Panel dans WPF et j'ai remarqué qu'en ce qui concerne les propriétés Width et Height , il existe également deux propriétés. d'autres propriétés appelées ActualWidth et ActualHeight .

  

ActualWidth

     

Obtient la largeur de rendu de cette   élément. C'est une dépendance   propriété. (Hérité de   FrameworkElement.)

     

Largeur

     

Obtient ou définit la largeur de l'élément.   C'est une propriété de dépendance.   (Hérité de FrameworkElement.)

Référence: MSDN

Quelqu'un peut-il indiquer les différences entre les deux et quand utiliser l'un ou l'autre?

Était-ce utile?

La solution

Largeur / Hauteur correspond à la taille demandée ou à la présentation . Si vous définissez sur Auto, la valeur est double.NaN lorsque vous accédez à la propriété dans le code derrière.

ActualWidth / ActualHeight est la taille rendue . Si vous souhaitez / avez besoin de la taille réelle de l'élément, utilisez cet attribut.

Autres conseils

Je trouve ActualWidth plus utile lorsque je souhaite lier la largeur ou la hauteur d'un élément à un autre.

Dans cet exemple simple, j'ai deux boutons disposés côte à côte et un commentaire en dessous qui est limité à la largeur du StackPanel contenant les deux boutons.

<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 pour compléter la valeur afin que vous ayez besoin de connaître ce numéro, vous pouvez appeler Actualwidth au lieu de width et éviter le calcul.

modifier: la marge supprimée b / c ne fait pas partie de ActualWidth.

ActualWidth est défini par le système de rendu et peut être différent en fonction de la largeur d'autres éléments et des contraintes de taille globale. En conséquence, cela ne peut pas être changé. Width est une propriété qui peut être modifiée et doit être utilisée pour augmenter ou réduire la largeur de l'élément.

De MSDN :

  

Cette propriété est une valeur calculée basée sur d'autres entrées de largeur et sur le système de présentation. La valeur est définie par le système de présentation lui-même, sur la base d'une étape de rendu réelle, et peut donc être légèrement inférieure à la valeur définie de propriétés telles que Width qui constituent la base du changement d'entrée.

Il existe une très bonne raison de ne pas utiliser le ActualWidth vers lequel se lier (évidemment ActualHeight en conséquence). Lorsque vous définissez Width d'un élément, sur ActualWidth d'un autre élément, vous pouvez interrompre la chaîne de présentation .

Dans le meilleur des cas, votre élément / contrôle doit être analysé une fois le processus de présentation du parent (la source de liaison) terminé. Cela signifie du temps supplémentaire. S'il se situe au même niveau hiérarchique que le parent, le processus de mise en page nécessite deux exécutions (au moins) pour calculer une taille définitive.

Par exemple, j'avais un contrôle dont la propriété size avait été remplacée par un style qui le définisse comme suit: TemplatedParent (ne pas utiliser) :

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
           Height="1" Fill="#000000"/>

Lors du redimensionnement de la fenêtre conteneur, le contrôle empêche le conteneur de devenir plus petit et freine la mise en page. Si vous le définissez sur Width , le problème (do) :

sera résolu.
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
           Height="1" Fill="#000000"/>

Si vous devez utiliser ActualWidth en général, quelque chose ne va pas avec votre xaml. Il vaut mieux corriger cela au lieu de jouer avec les tailles finales de la présentation.

C’est exactement cela, la largeur de rendu! = largeur de présentation. L'un est destiné à être utilisé pour la mise en page, l'autre est destiné au rendu. Comme avec WinForms, il y avait une propriété Size et une propriété ClientSize, elles diffèrent légèrement et vous devez utiliser la taille de rendu Atual / Client et la largeur / hauteur pour la présentation.

Vous pouvez définir la propriété Width , mais pas la propriété ActualWidth .

La propriété Width est utilisée pour déterminer le rendu du panneau, puis ActualWidth est défini sur la largeur réelle utilisée. Cela peut ne pas être la même valeur que Width, selon la taille de ses éléments enfants et les restrictions de son élément parent.

Le ActualWidth n'est pas défini immédiatement lors de la définition de la propriété Width , mais sera mis à jour (une ou plusieurs fois) lors du rendu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top