WPF中的Width和ActualWidth有什么区别?

时间:2009-03-03 19:42:43

标签: wpf size width actualwidth

我目前正在使用WPF中的Panel,我注意到WidthHeight属性,还有另外两个属性ActualWidthActualHeight

  

ActualWidth

     

获取此渲染的宽度   元件。这是一种依赖   属性。 (继承自   FrameworkElement。)受

     

Width

     

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

参考:MSDN

有人能指出两者之间的差异以及何时使用其中任何一个?

7 个答案:

答案 0 :(得分:68)

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

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

答案 1 :(得分:9)

当我想将一个元素的宽度或高度绑定到另一个元素时,我发现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>

答案 2 :(得分:6)

ActualWidth会在值中填充填充,因此,只要您需要知道该号码,就可以调用Actualwidth而不是宽度,并避免计算。

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

答案 3 :(得分:3)

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

来自MSDN

  

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

答案 4 :(得分:2)

有一个很好的理由不使用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就会出现问题。更好地修复它,而不是弄乱布局运行的最终大小。

答案 5 :(得分:0)

正是如此,渲染宽度!=布局宽度。一个用于布局,另一个用于渲染。它与WinForms一样,有一个Size和一个ClientSize属性,略有不同,你应该使用渲染的Atual / Client大小和布局的宽度/高度。

答案 6 :(得分:0)

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

Width属性用于确定面板的呈现方式,然后ActualWidth设置为实际使用的宽度。这可能与Width的值不同,具体取决于它的子元素的大小以及它的父元素的收缩。

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