2009-03-03 66 views
42

我目前在使用WPF中的Panel s,并且我注意到关于WidthHeight属性,还有两个其他属性,称为ActualWidthActualHeightWPF中的Width和ActualWidth有什么区别?

ActualWidth

获取此 元素的呈现宽度。这是一个依赖项 属性。 (继承自 FrameworkElement。)受

Width

获取或设置元件的宽度。 这是一个依赖项属性。 (继承自FrameworkElement。)

参考:MSDN

任何人都可以指出两个和何时使用任一之间的区别是什么?

回答

62

Width/Height要求或布局大小。如果您设置为“自动”,则当您访问代码后面的属性时,值为double.NaN

ActualWidth/ActualHeight呈现的大小。如果您需要/需要项目的实际大小,请使用此属性。

+7

它实际上是布局大小而不是渲染大小。 – chuckj 2009-03-04 09:40:45

+2

@chuckj,用什么属性来获取渲染大小? – dumbledad 2015-07-05 15:39:39

3

ActualWidth由渲染系统设置,并且可以根据其他元素的宽度和整体大小约束而不同。因此,它不能改变。 Width是可以更改的属性,应该用于增加或减少元素的宽度。

MSDN

此属性是基于其他宽度输入的计算值,和布局系统。该值由布局系统本身根据实际渲染过程设置,因此可能稍微落后于作为输入更改基础的属性(如Width)的设置值。

0

就是这样,渲染宽度!=布局宽度。一个旨在用于布置另一个用于渲染。它与WinForms一样,有一个Size和一个ClientSize属性,稍有不同,你应该使用渲染的Atual/Client大小和布局的宽度/高度。

0

您可以设置Width属性,但不能设置ActualWidth属性。

Width属性用于确定如何渲染面板,然后将ActualWidth设置为使用的实际宽度。这可能不是宽度相同的值,具体取决于它的子元素和来自其父元素的缩小的大小。

ActualWidth在设置Width属性时未立即设置,但会在渲染过程中更新(一次或多次)。

7

ActualWidth帐户填充的值,所以任何时候你需要知道这个数字,你可以调用Actualwidth而不是宽度,并避免计算。

编辑:删除保证金b/c它不是ActualWidth的一部分。

10

我发现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绑定到(显然ActualHeight相应)。 当您将一个元素的Width设置为另一个元素的ActualWidth时,您可以打开的布局链

在最好的情况下,您的元素/控件需要在父级(绑定源)的布局过程完成后解析。这意味着更多的时间。 如果它与父级相同,则布局过程需要两次运行(至少)来计算确定的大小。

比如我这有它的大小属性覆盖的风格,将其设置为TemplatedParent(不这样做)控制:

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
      Height="1" Fill="#000000"/> 

当调整包含窗口,控制将防止容器变得更小并且制动布局。如果你要使用的东西一般的ActualWidth是不对您的XAML

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
      Height="1" Fill="#000000"/> 

:将其设置为Width将解决此问题(做)。更好地解决这个问题,而不是搞乱布局运行的最终大小。

相关问题