51 votes

Quelle est la différence entre Width et ActualWidth dans WPF ?

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

ActualWidth

Obtient la largeur rendue de cet élément. Il s'agit d'une dépendance de l'élément. (Héritée de FrameworkElement.)

Width

Obtient ou définit la largeur de l'élément. Il s'agit d'une propriété de dépendance. (Héritée 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 ?

78voto

Muad'Dib Points 14260

Width / Height es el demandée ou mise en page taille. Si vous choisissez la valeur Auto, la valeur est alors double.NaN lorsque vous accédez à la propriété dans le code derrière.

ActualWidth / ActualHeight y RenderSize.Width / RenderSize.Height renvoient tous deux la taille rendue de l'élément, comme le fait la commande RenderSize est de type Taille . Si vous voulez/besoin de la taille réelle de l'article, utilisez l'un de ces attributs.

8 votes

Il s'agit en fait de la taille de la mise en page et non de la taille du rendu.

2 votes

@chuckj, quel attribut utiliserait-on pour obtenir la taille rendue ?

2 votes

@dumbledad .RenderSize.Width

11voto

Simon_Weaver Points 31141

Je trouve ActualWidth le plus utile lorsque je veux 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 contraint à 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>

7voto

TWood Points 901

ActualWidth tient compte du rembourrage dans la valeur, donc à chaque fois que vous avez besoin de connaître ce numéro, vous pouvez appeler. Actualwidth au lieu de la largeur et éviter le calcul.

edit : supprimé Margin car il ne fait pas partie de ActualWidth.

3voto

tuner Points 514

Il y a une très bonne raison de ne pas utiliser le ActualWidth à lier (évidemment ActualHeight en conséquence). Lorsque vous réglez le Width d'un élément, à la ActualWidth d'un autre que vous pouvez briser la chaîne de mise en page .

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

Par exemple, j'avais un contrôle dont la propriété de taille était surchargée dans un style qui la définissait comme étant la valeur TemplatedParent (ne pas faire) :

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

Lors du redimensionnement de la fenêtre qui le contient, le contrôle empêchait le conteneur de devenir plus petit et freinait la mise en page. En le réglant sur la valeur Width résoudra le problème (faire) :

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

Si vous devez utiliser le ActualWidth en général, il y a un problème avec votre xaml. Il vaut mieux corriger cela plutôt que de semer la pagaille avec les tailles finales de la mise en page.

1 votes

Vos extraits de code ("dont do" et "do") sont exactement les mêmes ?!?!

0 votes

Merci pour le commentaire. Je l'ai corrigé.

2 votes

@tuner Je ne suis pas d'accord avec ceci : "Si vous devez utiliser l'ActualWidth en général, quelque chose ne va pas dans votre xaml". Il n'y a rien de mal à lier à ActualWidth (o ActualHeight ), en effet, dans certains cas, cela peut être la manière la plus simple de résoudre un problème de mise en page particulier. Ce n'est pas parce que la liaison à ces propriétés pose des problèmes en de (rares) occasions qu'il faut les éviter complètement.

3voto

ajm Points 10000

ActualWidth est définie par le système de rendu, et peut être différente en fonction de la largeur des autres éléments et des contraintes de taille globale. Par conséquent, elle ne peut pas être modifiée. Width est une propriété qui peut être modifiée, et doit être utilisée pour augmenter ou diminuer la largeur de l'élément.

Desde MSDN :

Cette propriété est une valeur calculée en fonction des autres entrées de largeur et du système de mise en page. La valeur est définie par le système de mise en page lui-même, sur la base d'un passage de rendu réel, et peut donc être légèrement en retard sur la valeur définie des propriétés telles que Width qui sont à la base de la modification des entrées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X