Подтвердить что ты не робот

В чем разница между Width и ActualWidth в WPF?

В настоящее время я работаю с Panel в WPF, и я заметил, что в отношении свойств Width и Height есть еще два свойства, называемые ActualWidth и ActualHeight.

ActualWidth

Получает отображаемую ширину этого элемент. Это зависимость имущество. (Унаследовано от FrameworkElement.)

Width

Получает или задает ширину элемента. Это свойство зависимостей. (Унаследовано от FrameworkElement.)

Ссылка: MSDN

Можно ли указать различия между ними и когда использовать один из них?

4b9b3361

Ответ 1

Width/Height - это размер запрошенный или макет. Если вы установите значение "Авто", то при доступе к свойству в коде позади будет double.NaN.

ActualWidth/ActualHeight - размер rendered. Если вам нужен/нужен фактический размер элемента, используйте этот атрибут.

Ответ 2

Я нахожу ActualWidth наиболее полезным, когда хочу привязать ширину или высоту одного элемента к другому.

В этом простом примере у меня есть две кнопки, расположенные рядом друг с другом, и под ним находится комментарий, который ограничен шириной StackPanel, содержащей две кнопки.

<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>

Ответ 3

ActualWidth учитывает заполнение в значении, поэтому в любое время вам нужно знать этот номер, который вы можете назвать ActualWidth вместо ширины и избежать вычисления.

edit: удален Маржа b/c не является частью ActualWidth.

Ответ 4

ActualWidth устанавливается системой рендеринга и может отличаться в зависимости от ширины других элементов и ограничений по размеру. В результате его нельзя изменить. Width - это свойство, которое может быть изменено и должно использоваться для увеличения или уменьшения ширины элемента.

От MSDN:

Это свойство представляет собой рассчитанное значение, основанное на других входах ширины и системе компоновки. Значение устанавливается самой компоновкой, основанной на фактическом проходе рендеринга, и поэтому может немного отставать от установленного значения свойств, таких как Width, которые являются основой изменения ввода.

Ответ 5

Существует очень хорошая причина не использовать ActualWidth для привязки (очевидно, ActualHeight соответственно). Когда вы устанавливаете Width элемента, в ActualWidth другого, вы можете разорвать цепочку компоновки.

В лучшем случае ваш элемент/элемент управления необходимо проанализировать после завершения процесса компоновки родителя (источника привязки). Это означает дополнительное время. Если он находится на том же уровне иерархии, что и родительский, для процесса компоновки требуется два прогона (по крайней мере) для вычисления окончательного размера.

Например, у меня был элемент управления, у которого было свойство size, переопределенное в стиле, который установил бы его в TemplatedParent (не делать):

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

При изменении размера окна, содержащегося в нем, управление предотвратит уменьшение размера контейнера и торможение компоновки. Установка его в Width решит проблему (do):

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

Если вам нужно использовать ActualWidth, что-то не так с вашим xaml. Лучше исправить это, вместо того, чтобы испортить окончательные размеры макета.

Ответ 6

Это точно, ширина визуализации!= макет ширины. Один из них предназначен для компоновки, другой предназначен для рендеринга. Как и в случае с WinForms, существовало свойство Size и ClientSize, они немного отличаются, и вы должны использовать размер рендеринга Atual/Client и ширину/высоту для макета.

Ответ 7

Вы можете установить свойство Width, но не свойство ActualWidth.

Свойство Width используется для определения того, как отображается панель, а затем ActualWidth устанавливается фактическая ширина, которая была использована. Это может быть не такое же значение, как ширина, в зависимости от размера его дочерних элементов и сужений от него родительского элемента.

ActualWidth не устанавливается сразу при настройке свойства Width, но будет обновляться (один или несколько раз) во время рендеринга.