В чем разница между шириной и ActualWidth в WPF?
-
03-07-2019 - |
Вопрос
В настоящее время я работаю с Panel
s в WPF, и я заметил, что что касается Width
и Height
свойства, есть также два других свойства, называемые ActualWidth
и ActualHeight
.
ActualWidth
Получает визуализированную ширину этого элемента.Это свойство зависимости.(Унаследован от FrameworkElement.)
Width
Получает или задает ширину элемента.Это свойство зависимости.(Унаследовано от FrameworkElement.)
Ссылка: MSDN
Может ли кто-нибудь указать различия между ними и когда использовать любой из них?
Решение
Width
/Height
это по запросу или макет размер.Если вы установите значение «Авто», то значение будет double.NaN
когда вы получаете доступ к свойству в коде позади.
ActualWidth
/ActualHeight
это оказанный размер.Если вам нужен фактический размер элемента, используйте этот атрибут.
Другие советы
я нахожу 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>
ActualWidth
учитывает дополнение значения, поэтому в любое время, когда вам нужно знать этот номер, вы можете позвонить Actualwidth
вместо ширины и избежать вычислений.
редактировать:удалено поле, поскольку оно не является частью ActualWidth.
ActualWidth
задается системой рендеринга и может отличаться в зависимости от ширины других элементов и общих ограничений размера.В результате его невозможно изменить. Width
— это свойство, которое можно изменить и которое следует использовать для увеличения или уменьшения ширины элемента.
От MSDN:
Это свойство представляет собой расчетное значение, основанное на других входных данных ширины и системе макета.Значение устанавливается самой системой макета на основе фактического прохода рендеринга и поэтому может немного отставать от установленного значения таких свойств, как
Width
которые являются основой изменения ввода.
Есть очень веская причина не использовать ActualWidth
привязываться к (очевидно ActualHeight
соответственно).Когда вы установите Width
элемента, к ActualWidth
другого вы можете разорвать цепочку макетов.
В лучшем случае ваш элемент/элемент управления необходимо проанализировать после завершения процесса компоновки родительского элемента (источника привязки).Это означает дополнительное время.Если он находится на том же уровне иерархии, что и родительский, процесс компоновки требует как минимум двух прогонов для расчета окончательного размера.
Например, у меня был элемент управления, свойство размера которого было переопределено в стиле, который установил бы для него значение TemplatedParent
(не делай):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
При изменении размера содержащего окна элемент управления будет препятствовать уменьшению размера контейнера и тормозить макет.Установка его в Width
решит проблему (делать):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
Если вам нужно использовать ActualWidth
вообще что-то не так с вашим xaml.Лучше исправьте это, вместо того, чтобы портить окончательные размеры макета.
Именно так: ширина рендеринга! = ширина макета.Один предназначен для макетирования, другой — для рендеринга.Как и в случае с WinForms, здесь есть свойства Size и ClientSize, они немного отличаются, и вам следует использовать размер Atual/Client для рендеринга и ширину/высоту для макета.
Вы можете установить Width
имущество, но не ActualWidth
свойство.
А Width
свойство используется для определения того, как отображается панель, затем ActualWidth
устанавливается на фактическую ширину, которая использовалась.Это значение может отличаться от значения Width, в зависимости от размера дочерних элементов и ограничений родительского элемента.
А ActualWidth
не устанавливается сразу при настройке Width
свойство, но будет обновляться (один или несколько раз) во время рендеринга.