Вопрос

В настоящее время я работаю с Panels в 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 свойство, но будет обновляться (один или несколько раз) во время рендеринга.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top