2011-06-19 39 views
21

tôi muốn biết chiều cao của tất cả các mục của tôi StackPanel.Stackpanel: Chiều cao so với ActualHeight so với ExtentHeight vs ViewportHeight vs DesiredSize vs RenderSize

sự khác biệt giữa là gì:

  • Height - Gets hoặc đặt chiều cao đề nghị của nguyên tố này.
  • ActualHeight - Nhận chiều cao được hiển thị của phần tử này. (chỉ đọc)
  • ExtentHeight - Nhận giá trị chứa kích thước theo chiều dọc. (chỉ đọc)
  • ViewportHeight - Nhận giá trị chứa kích thước dọc của chế độ xem nội dung. (chỉ đọc)
  • DesiredSize - Lấy kích thước mà phần tử này được tính trong quá trình đo lường của quá trình bố cục. (chỉ đọc)
  • RenderSize - Gets (hoặc đặt, nhưng xem Chú thích) kích thước kết xuất cuối cùng của phần tử này.

Từ MSDN:

Height
Gets hoặc đặt chiều cao đề nghị của nguyên tố này.

Giá trị thuộc tính: Double - Chiều cao của phần tử, trong đơn vị thiết bị độc lập (1/96 inch trên mỗi đơn vị).

Chiều cao của phần tử, trong đơn vị thiết bị độc lập (1/96 inch trên mỗi đơn vị).

 

ActualHeight (readonly)
Gets chiều cao render của nguyên tố này.

Giá trị thuộc tính: Double - Chiều cao của phần tử, dưới dạng giá trị trong đơn vị độc lập thiết bị (1/96 inch trên mỗi đơn vị).

Thuộc tính này là giá trị được tính toán dựa trên các yếu tố đầu vào chiều cao khác và hệ thống bố cục. 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 một chút so với giá trị được đặt của các thuộc tính như Height là cơ sở của thay đổi đầu vào.

Vì ActualHeight là một giá trị được tính toán, bạn nên lưu ý rằng có thể có nhiều thay đổi hoặc báo cáo gia tăng đối với nó do các hoạt động khác nhau của hệ thống bố trí. Hệ thống bố trí có thể được tính toán yêu cầu đo không gian cho các phần tử con, các ràng buộc bởi phần tử cha, v.v.

 

ExtentHeight (readonly)
Gets một giá trị có chứa các kích thước dọc của mức độ.

Chiều cao tài sản: Double - Số đôi thể hiện kích thước theo chiều dọc.

Giá trị trả lại được mô tả trong Thiết bị độc lập pixel.

 

ViewportHeight (readonly)
Gets một giá trị có chứa các kích thước dọc của khung nhìn của nội dung.

Giá trị thuộc tính: Double - Đôi biểu thị kích thước dọc của chế độ xem nội dung.

Giá trị trả lại được mô tả trong Thiết bị độc lập pixel.

 

DesiredSize (readonly)
Gets kích thước mà yếu tố này được tính toán trong biện pháp vượt qua của quá trình bố trí.

Giá trị thuộc tính: Size - Kích thước được tính, kích thước này sẽ trở thành kích thước mong muốn cho thẻ sắp xếp.

Giá trị được trả lại bởi thuộc tính này sẽ chỉ là phép đo hợp lệ nếu giá trị của thuộc tính IsMeasureValid là đúng. DesireSize thường được kiểm tra là một trong những yếu tố đo khi bạn thực hiện ghi đè hành vi bố trí như ArrangeOverride, MeasureOverride hoặc OnRender (trong trường hợp OnRender, bạn có thể kiểm tra RenderSize thay thế, nhưng điều này phụ thuộc vào việc triển khai của bạn). Tùy thuộc vào kịch bản, DesiredSize có thể được hoàn toàn tôn trọng bởi logic thực thi của bạn, các ràng buộc trên DesiredSize có thể được áp dụng, và các ràng buộc đó cũng có thể thay đổi các đặc tính khác của phần tử cha hoặc phần tử con. Ví dụ, một điều khiển hỗ trợ các vùng có thể cuộn (nhưng chọn không lấy được từ các điều khiển cấp khuôn khổ WPF đã cho phép các vùng có thể cuộn) có thể so sánh kích thước có sẵn với DesiredSize. Sau đó, điều khiển có thể thiết lập trạng thái bên trong đã bật thanh cuộn trong giao diện người dùng cho điều khiển đó. Hoặc, DesiredSize cũng có thể bị bỏ qua trong một số trường hợp nhất định.

 

RenderSize Gets render thức kích thước của nguyên tố này.

Giá trị thuộc tính: Size - Kích thước được hiển thị cho phần tử này.

Thuộc tính này có thể được sử dụng để kiểm tra kích thước hiển thị có thể áp dụng trong phần ghi đè hệ thống bố cục như OnRender hoặc GetLayoutClip.

Một trường hợp phổ biến hơn là xử lý sự kiện SizeChanged với ghi đè xử lý lớp hoặc sự kiện OnRenderSizeChanged.


Trong trường hợp của tôi, tôi muốn biết mong muốn chiều cao của tất cả các mục trong StackPanel.

Nói cách khác: tôi muốn biết chiều cao của tất cả các mục trong StackPanel (trước khi vẽ), và nếu họ tràn bảng điều khiển, tôi sẽ

  • xóa
  • teo
  • quy mô
  • điều chỉnh

mục để đảm bảo chúng phù hợp trong StackPanel.

Có nghĩa là tôi có thể muốn có được mong muốn chiều cao (DesiredSize ExtentHeight?) Trong một sự kiện thay đổi kích thước (SizeChangedLayoutUpdated?) - trước khi bất kỳ bản vẽ xảy ra (do đó, nó nhanh hơn).

Hầu hết các thuộc tính này đều trả về 0; vì vậy rõ ràng là có một số hiểu biết về những gì các thuộc tính này có nghĩa là tôi không biết và không được giải thích trong tài liệu.

Trả lời

14

Như bạn đã biết, StackPanel là đối tượng [Bảng điều khiển]. Mỗi bảng giao tiếp với trẻ em bằng hai phương pháp để xác định kích thước và vị trí cuối cùng. Phương pháp đầu tiên là MeasureOverride và phương pháp thứ hai là ArrangeOverride.

MeasureOveride yêu cầu mỗi đứa trẻ cho kích thước mong muốn với một lượng không gian nhất định có sẵn. ArrangeOverride sắp xếp các trẻ em sau khi đo lường đã được hoàn thành.

Hãy tạo một stackpanel:

public class AnotherStackPanel : Panel 
{ 
    public static readonly DependencyProperty OrientationProperty = 
     DependencyProperty.Register(“Orientation”, typeof(Orientation), 
     typeof(SimpleStackPanel), new FrameworkPropertyMetadata(
     Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    public Orientation Orientation 
    { 
     get { return (Orientation)GetValue(OrientationProperty); } 
     set { SetValue(OrientationProperty, value); } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size desiredSize = new Size(); 

     if (Orientation == Orientation.Vertical) 
      availableSize.Height = Double.PositiveInfinity; 
     else 
      availableSize.Width = Double.PositiveInfinity; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       child.Measure(availableSize); 

       if (Orientation == Orientation.Vertical) 
       { 
        desiredSize.Width = Math.Max(desiredSize.Width, 
        child.DesiredSize.Width); 
        desiredSize.Height += child.DesiredSize.Height; 
       } 
       else 
       { 
        desiredSize.Height = Math.Max(desiredSize.Height, 
        child.DesiredSize.Height); 
        desiredSize.Width += child.DesiredSize.Width; 
       } 
      } 
     } 
     return desiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     double offset = 0; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       if (Orientation == Orientation.Vertical) 
       {    
        child.Arrange(new Rect(0, offset, finalSize.Width, 
        child.DesiredSize.Height));     
        offset += child.DesiredSize.Height; 
       } 
       else 
       {     
        child.Arrange(new Rect(offset, 0, child.DesiredSize.Width, 
        finalSize.Height)); 
        offset += child.DesiredSize.Width; 
       } 
      } 
     } 
     return finalSize; 
    } 
} 
  • Các DesiredSize (kích thước trả về bởi MeasureOverride) là tổng các kích cỡ con theo hướng StackPanel và kích thước của con lớn nhất trong chỉ dân khac.

  • RenderSize đại diện cho số cuối cùng của StackPanel sau khi bố cục hoàn tất.

  • ActualHeight hoàn toàn giống với RenderSize.Height.

Để dựa vào các thuộc tính này, bạn chỉ nên truy cập chúng trong một trình xử lý sự kiện cho sự kiện LayoutUpdated.

3

Trên câu trả lời là đúng, ngoại trừ RenderSize đó và ActualHeight có thể có giá trị tạm thời khác nhau. RenderSize được thiết lập trước khi OnRender, trong khi ActualHeight được thiết lập khi WPF đã hoàn tất bố cục và xử lý hiển thị cho điều khiển đó. Cuối cùng, LayoutUpdated được nâng lên.

Do đó, RenderSize có thể được sử dụng trong OnRender, nhưng ActualHeight sẽ vẫn có giá trị cũ từ trước khi bố cục bắt đầu.

Trình tự như sau:

MeasureOverride() => sets DesiredSize 
ArrangeOverride() => sets RenderSize 
OnRender() 

WPF có thể thực hiện trình tự này nhiều lần (đệ quy). Khi mọi thứ đã được giải quyết, những điều sau sẽ được thực hiện:

ActualHeight = RenderSize.Height 

Thực tế Có thể truy cập bất kỳ lúc nào (!) Sau khi bố trí xong, ngoại trừ trong quá trình bố cục chính xác, sắp xếp và hiển thị. WPF đảm bảo rằng bất kỳ mã nào được hoàn thành trước khi xử lý bố cục chạy.

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