В чем разница между шириной и фактической шириной в WPF?
В настоящее время я работаю с Panel
s в WPF, и я заметил, что в отношении Width
а также Height
свойства, есть также два других свойства, называемые ActualWidth
а также ActualHeight
,
ActualWidth
Получает визуализированную ширину этого элемента. Это свойство зависимости. (Унаследовано от FrameworkElement.)
Width
Получает или задает ширину элемента. Это свойство зависимости. (Унаследовано от FrameworkElement.)
Ссылка: MSDN
Кто-нибудь может указать на различия между двумя и когда использовать один из них?
7 ответов
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
вместо ширины и избежать расчета.
edit: удалено Margin b/c, оно не является частью ActualWidth.
Есть очень веская причина не использоватьActualWidth
привязать к (очевидно, ActualHeight
соответственно). Когда вы устанавливаете Width
элемента, к ActualWidth
другого вы можете разорвать цепочку макетов.
В лучшем случае ваш элемент / элемент управления должен быть проанализирован после завершения процесса компоновки родительского элемента (источника привязки). Это означает дополнительное время. Если он находится на том же уровне иерархии, что и родительский, процессу макета требуется два прогона (как минимум), чтобы рассчитать окончательный размер.
Например, у меня был элемент управления, у которого свойство size было переопределено в стиле, который устанавливал бы его на 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. Лучше исправить это, чем испортить окончательные размеры макета.
ActualWidth
устанавливается системой рендеринга и может отличаться в зависимости от ширины других элементов и ограничений общего размера. В результате его нельзя изменить. Width
это свойство, которое может быть изменено и должно использоваться для увеличения или уменьшения ширины элемента.
Из MSDN:
Это свойство является расчетным значением, основанным на других значениях ширины и системе макета. Значение устанавливается самой системой макета на основе фактического прохода рендеринга и поэтому может немного отставать от заданного значения свойств, таких как
Width
которые являются основой изменения ввода.
Это именно то, ширина рендеринга!= Ширина макета. Один предназначен для макета, другой предназначен для рендеринга. Как и в WinForms, было свойство Size и ClientSize, они немного отличаются, и вы должны использовать размер рендеринга Atual/Client и Width/Height для макета.
Вы можете установить Width
собственность, но не ActualWidth
имущество.
Width
свойство используется, чтобы определить, как отображается панель, затем ActualWidth
устанавливается на фактическую ширину, которая была использована. Это может не совпадать со значением Width, в зависимости от размера его дочерних элементов и ограничений его родительского элемента.
ActualWidth
не устанавливается сразу при настройке Width
свойство, но будет обновлено (один или несколько раз) во время рендеринга.