В чем разница между шириной и фактической шириной в WPF? - PullRequest
46 голосов
/ 03 марта 2009

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

ActualWidth

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

Width

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

Ссылка: MSDN

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

Ответы [ 7 ]

68 голосов
/ 03 марта 2009

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

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

9 голосов
/ 25 октября 2010

Я считаю 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>
6 голосов
/ 21 октября 2010

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

edit: удалено поле, потому что оно не является частью ActualWidth.

3 голосов
/ 03 марта 2009

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

С MSDN :

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

2 голосов
/ 04 октября 2013

Существует очень веская причина не использовать 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. Лучше исправить это, вместо того, чтобы портить окончательные размеры макета.

0 голосов
/ 03 марта 2009

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

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

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

0 голосов
/ 03 марта 2009

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

...