2009-03-03 35 views
42

Tôi hiện đang làm việc với Panel s trong WPF và tôi nhận thấy rằng về các thuộc tính WidthHeight, cũng có hai thuộc tính khác được gọi là ActualWidthActualHeight.Sự khác biệt giữa độ rộng và ActualWidth trong WPF là gì?

ActualWidth

Gets chiều rộng render của nguyên tố này. Đây là thuộc tính phụ thuộc . (Kế thừa từ FrameworkElement.)

Width

Gets hoặc bộ chiều rộng của phần tử. Đây là thuộc tính phụ thuộc. (Kế thừa từ FrameworkElement.)

tham khảo: MSDN

bất cứ ai có thể chỉ ra sự khác biệt giữa hai và khi nào thì sử dụng một trong hai?

Trả lời

62

Width/Height yêu cầu hoặc bố cục kích thước. Nếu bạn đặt thành Tự động, thì giá trị là double.NaN khi bạn truy cập thuộc tính ở mã phía sau.

ActualWidth/ActualHeight hiển thị kích thước. Nếu bạn muốn/cần kích thước thực của mục, thì hãy sử dụng thuộc tính này.

+7

Đó thực sự là kích thước bố cục không phải kích thước được hiển thị. – chuckj

+2

@chuckj, thuộc tính nào sẽ sử dụng để nhận kích thước được hiển thị? – dumbledad

+0

@dumbledad '.RenderSize.Width' – Mafii

3

ActualWidth được thiết lập bởi hệ thống hiển thị và có thể khác nhau tùy thuộc vào độ rộng của các yếu tố khác và ràng buộc kích thước tổng thể. Kết quả là, nó không thể thay đổi. Width là thuộc tính có thể thay đổi và được sử dụng để tăng hoặc giảm chiều rộng của phần tử.

Từ MSDN:

Khách sạn này là một giá trị được tính toán dựa trên đầu vào chiều rộng khác, và hệ thống bố trí. Giá trị được thiết lập bởi chính hệ thống bố trí, dựa trên một đường dẫn hiển thị thực tế và do đó có thể tụt hậu so với giá trị đã đặt của các thuộc tính như Width làm cơ sở cho thay đổi đầu vào.

0

Chính xác là độ rộng hiển thị! = Chiều rộng bố cục. Một được thiết kế để được sử dụng để bố trí một trong những khác là dành cho render. Nó giống như với WinForms, có một kích thước và một tài sản ClientSize, sự khác biệt một chút và bạn nên sử dụng kích thước Atual/Client của rendering và Width/Height cho layout.

0

Bạn có thể đặt thuộc tính Width, chứ không phải thuộc tính ActualWidth.

Thuộc tính Width được sử dụng để xác định cách hiển thị bảng điều khiển, sau đó ActualWidth được đặt thành chiều rộng thực tế đã được sử dụng. Điều này có thể không có cùng giá trị với Chiều rộng, tùy thuộc vào kích thước của các phần tử con và các chòm sao từ phần tử cha của nó.

ActualWidth không được đặt ngay lập tức khi đặt thuộc tính Width nhưng sẽ được cập nhật (một hoặc nhiều lần) trong khi hiển thị.

7

ActualWidth chiếm đệm trong giá trị, vì vậy bất cứ khi nào bạn cần biết số điện thoại bạn có thể gọi Actualwidth thay vì chiều rộng và tránh tính toán.

chỉnh sửa: Đã xóa Margin b/c không phải là một phần của ActualWidth.

10

Tôi tìm thấy ActualWidth hữu ích nhất khi tôi muốn ràng buộc chiều rộng hoặc chiều cao của phần tử này với phần tử khác.

Trong ví dụ đơn giản này, tôi có hai nút được sắp xếp cạnh nhau và nhận xét bên dưới bị hạn chế về chiều rộng của StackPanel chứa hai nút.

<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

Có một lý do rất tốt không sử dụng ActualWidth để ràng buộc vào (rõ ràng ActualHeight cho phù hợp). Khi bạn đặt Width của một phần tử, thành ActualWidth của một số khác, bạn có thể phá vỡ chuỗi bố cục.

Trong trường hợp tốt nhất, phần tử/kiểm soát của bạn cần được phân tích cú pháp sau khi quá trình bố cục của nguồn gốc (nguồn ràng buộc) hoàn tất. Điều đó có nghĩa là thêm thời gian. Nếu nó ở cấp độ phân cấp giống như bố mẹ, quá trình bố trí cần hai lần chạy (ít nhất) để tính toán kích thước cuối cùng.

Ví dụ tôi có một điều khiển mà có nó sở hữu kích thước ghi đè trong một phong cách mà sẽ đặt nó vào TemplatedParent(không làm):

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

Khi thay đổi kích thước cửa sổ chứa, kiểm soát sẽ ngăn container trở nên nhỏ hơn và phanh bố trí. Đặt nó vào Width sẽ giải quyết vấn đề (làm):

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

Nếu bạn phải sử dụng ActualWidth nói chung cái gì là sai với XAML của bạn. Sửa lỗi tốt hơn thay vì làm rối tung các kích thước cuối cùng của bố cục chạy.

+1

Đoạn mã của bạn (" không làm "và" làm ") là chính xác như nhau?!?! – PIntag

+0

Cảm ơn nhận xét. Sửa lỗi đó. – Pascal

+1

@tuner Tôi không đồng ý với điều này: "Nếu bạn phải sử dụng ActualWidth nói chung có điều gì đó sai với xaml của bạn". Không có gì sai khi liên kết với 'ActualWidth' (hoặc' ActualHeight'), thực ra trong một số trường hợp, đây có thể là cách dễ nhất để giải quyết một vấn đề bố trí cụ thể. Chỉ vì ràng buộc với các đặc tính này gây ra các vấn đề trong các trường hợp (hiếm) là không có lý do gì để tránh chúng hoàn toàn. –

Các vấn đề liên quan