2011-12-29 43 views
6

Tôi đang cố gắng lấy ActualSize của MyUserControl trước khi được hiển thị bằng cách sử dụng Measure methode của UserControl lớp như được đề xuất cho số previous question của tôi. Tuy nhiên nó không hoạt động. MyUserControl có một số ItemsControl được mã hóa theo số List như được hiển thị bên dưới. Các mục được thêm vào thông qua uc.MyCollection = myCollection; không được phản ánh trong uc.DesiredSize.Height.Nhận kích thước thực tế của UserControl trước khi hiển thị

MyUserControl uc= new MyUserControl(); 
uc.AName = "a1"; 
uc.Width = 194; 
uc.MyCollection = myCollection; //myCollection is a List databound to ItemsControl inside MyUserControl 
uc.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
uc.Arrange(new Rect(0, 0, uc.DesiredSize.Width, uc.DesiredSize.Width)); //Needed? 
uc.UCHeight = uc.DesiredSize.Height; //size of items databound to ItemsControl not reflected here 
uc.UCWidth = uc.DesiredSize.Width; 
uc.Margin = new Thickness(34, 42, 0, 0); 
myRoot.Children.Add(uc); //myRoot is Canvas 
+3

Thử thêm 'uc' vào thư mục gốc trước khi gọi' Mesaure() 'và thực hiện' UpdateLayout() 'trước khi truy cập' DesiredSize'. Đó là những gì tôi thường làm. – kev

+0

Điều đó không hoạt động. – devnull

+0

@neutrino: những gì không hoạt động? Các giá trị là. 0 hoặc không chính xác? Giá trị – Tigran

Trả lời

6

Bạn phải ghi đè MeasureOverride và ArrangeOverride trong uc để tính kích thước cho riêng bạn. Bên trong MeasureOverride "yêu cầu" Danh sách của bạn với "Thước đo" có kích thước riêng của nó - vì vậy bạn có thể tính kích thước cho uc của riêng bạn (trả về kích thước này trong MeasureOverride) - sau đó bạn nhận được DesiredSize sau khi gọi uc.Measure.

+2

Tôi khá chắc chắn bạn chỉ phải triển khai các phương pháp này trên triển khai bảng tùy chỉnh. UC chỉ đơn giản là một tổng hợp các điều khiển khác, vì vậy không cần thiết phải thực hiện chúng. – ColinE

+0

Điều gì sẽ xảy ra nếu điều khiển người dùng có 'ItemsControl' được liên kết với một' Danh sách'? Sau khi tạo usercontrol, tôi thiết lập gán thuộc tính 'List' mà' ItemsControl' của 'UserControl' bị ràng buộc. Vấn đề là lệnh 'Measure' trên usercontrol trả về' DesiredSize.Height' mà không tính đến chiều cao của 'ItemsControl'. – devnull

1

ItemsControl bạn gắn vào MyCollection sẽ không xử lý cho đến khi điều khiển người dùng của bạn là ở VisualTree, vì vậy tại thời điểm bạn gọi Measure, các desiredsize vẫn là 0.

Khi tôi cần để có được kích thước của một FrameworkElement, Tôi đặt Opacity là 0, thêm nó vào cây thị giác và chờ sự kiện SizeChanged.

0

Xem https://msdn.microsoft.com/en-us/library/6xe5hazb(v=vs.110).aspx Tham số "ByVal e như PaintEventArgs" trong ví dụ là không cần thiết. Để chỉ lấy kích thước cần thiết để hiển thị toàn bộ chuỗi, bạn có thể tạo trường paintEventArgs của riêng bạn trong chương trình con MeasureStringMin.

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