2009-03-03 20 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將解決此問題(做)。更好地解決這個問題,而不是搞亂佈局運行的最終大小。

相關問題