50

我目前Panel在 WPF 中使用 s ,我注意到关于WidthandHeight属性,还有另外两个称为ActualWidthand的属性ActualHeight

ActualWidth

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

Width

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

参考:MSDN

谁能指出两者之间的区别以及何时使用其中之一?

4

7 回答 7

75

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

ActualWidth//ActualHeightRenderSize.Width/RenderSize.Height都返回元素的渲染大小,因为RenderSizeSize类型。如果您想要/需要项目的实际大小,请使用这些属性中的任何一个。

于 2009-03-03T19:48:57.890 回答
11

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>
于 2010-10-25T02:34:56.933 回答
7

ActualWidth考虑值中的填充,因此任何时候您都需要知道可以调用的数字Actualwidth而不是宽度并避免计算。

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

于 2010-10-21T16:20:57.040 回答
4

有一个很好的理由不使用ActualWidthto 绑定到(显然ActualHeight相应地)。当您将Width一个元素的设置ActualWidth为另一个元素时,您可能会破坏布局链

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

例如,我有一个控件,它的 size 属性被一种样式覆盖,该样式会将其设置为TemplatedParent (don't do)

<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 有问题。更好地解决这个问题,而不是弄乱布局运行的最终大小。

于 2013-10-04T11:32:10.530 回答
3

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

来自MSDN

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

于 2009-03-03T19:46:41.237 回答
0

正是这样,渲染宽度!=布局宽度。一个用于布局,另一个用于渲染。它与 WinForms 一样,有一个 Size 和一个 ClientSize 属性,略有不同,您应该使用 Atual/Client 的渲染大小和 Width/Height 进行布局。

于 2009-03-03T19:47:11.030 回答
0

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

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

ActualWidth设置属性时不会立即设置,Width但会在渲染期间更新(一次或多次)。

于 2009-03-03T19:52:28.680 回答