В чем разница между Width и ActualWidth в WPF?
В настоящее время я работаю с Panel
в WPF, и я заметил, что в отношении свойств Width
и Height
есть еще два свойства, называемые ActualWidth
и ActualHeight
.
ActualWidth
Получает отображаемую ширину этого элемент. Это зависимость имущество. (Унаследовано от FrameworkElement.)
Width
Получает или задает ширину элемента. Это свойство зависимостей. (Унаследовано от FrameworkElement.)
Ссылка: MSDN
Можно ли указать различия между ними и когда использовать один из них?
Ответы
Ответ 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
, но будет обновляться (один или несколько раз) во время рендеринга.