2012-01-13 37 views
6

Ai có thể phát hiện ra sai lầm mà tôi đang làm không?Thêm trẻ em vào stackpanel lập trình không hoạt động

Đây là mã:

 StackPanel stackPanel = new StackPanel(); 
     stackPanel.Orientation = Orientation.Vertical; 
     for (int index = _elements.Count - 1; index >= 0; index--) 
     { 
      FrameworkElement element = _elements[index]; 
      WriteableBitmap tempBitmap = new WriteableBitmap(element, null); 
      Image image = new Image(); 
      image.Source = tempBitmap; 
      stackPanel.Children.Add(image); 
     } 

     stackPanel.UpdateLayout(); 

     _bitmap = new WriteableBitmap(stackPanel, null); 

     _bitmap.Invalidate(); 

Như bạn có thể thấy tôi đang tạo ra một hình ảnh tạm thời và sau đó thêm nó vào StackPanel và sau đó tạo ra một WriteableBitmap thức. Myy 1 con của stackpanel là chiều cao 154 và thứ hai là 389. Sau dòng này:

_bitmap.Invalidate(); 

khi tôi nhìn thấy PixelHeight nó chỉ là 389. Đứa con thứ nhất của tôi đi đâu?

Trả lời

2

Trong khi cả hai câu trả lời được đưa ra bởi sLedgem và bathineni là chính xác, nó dường như không phù hợp với hoàn cảnh của tôi. Ngoài ra tại sao tôi muốn thêm chúng vào bố cục? Nếu nó thuận tiện cho bạn, bạn có thể nhưng trong trường hợp của tôi, tôi muốn chúng ở trong bộ nhớ 100% vì lớp trợ giúp của tôi được sử dụng về cơ bản để in không có bất kỳ tham chiếu nào đến bất kỳ UIElements nào hiện diện trên màn hình. Trong trường hợp đó rõ ràng là tôi sẽ không muốn vượt qua LayoutRoot của tôi hoặc một số Panel khác đến lớp trợ giúp của tôi chỉ để thực hiện việc hack này!

Để yêu cầu thời gian chạy Silverlight hiển thị các phần tử trong bộ nhớ. Bạn cần phải gọi Đo lường và Sắp xếp:

Vì vậy, thường tất cả những gì đã mất tích được:

stackPanel.Measure(new Size(width, height)); 
stackPanel.Arrange(new Rect(0, 0, width, height)); 

trước:

_bitmap = new WriteableBitmap(stackPanel, null); 

Và tôi có thể thoát khỏi dòng này:

stackPanel.UpdateLayout(); 

Hy vọng điều này sẽ giúp ai đó đến trên chủ đề này và có cùng một vấn đề như tôi, nơi nó không phải là khả thi để tìm LayoutRoo t trong lớp trợ giúp của bạn.

+0

Một số thứ cần thêm, cố gắng đặt chiều cao và chiều rộng một cách rõ ràng cho bảng xếp chồng và sử dụng nó để đặt 'Kích thước' và' Chỉnh sửa' –

0

stackPanel hoặc bất kỳ bảng nào khác sẽ không hiển thị cho đến khi chúng được thêm vào visulatree (bất kỳ phần tử trực quan nào) .. có nghĩa là .. nếu bạn đã thêm 100 mục vào stackpanel 100 yếu tố đó sẽ không được tạo cho đến khi stackpanel xuất hiện trực quan màn hình ..

nếu bạn không muốn hiển thị stackpanel trên màn hình, sau đó thêm stackpanel và xóa nó ngay lập tức. nó sẽ làm cho stackpanel làm cho nó yếu tố con ...

HOẶC

Tạo một mạng lưới hoặc stackpanel trong XAML trong đó có 1 chiều cao pixel và chiều rộng và thêm stackpanel của bạn để lưới đó hoặc stackpanel ... do đó, nó sẽ không được hiển thị trên màn hình và nó sẽ được hiển thị trên nền ....

+0

Câu trả lời của bạn là chính xác nhưng không phải lúc nào cũng khả thi. Xem câu trả lời của tôi. – TCM

0

bathineni là đúng, bạn cần hiển thị stackpanel trước khi chụp nhanh. Tôi sẽ đề nghị để cho nó render một khung và sau đó lấy bitmap sau khi nó đã trả lại

 CompositionTarget.Rendering += CompositionTarget_Rendering; 
} 

void CompositionTarget_Rendering(object sender, EventArgs e) 
    { 
    _bitmap = new WriteableBitmap(stackPanel, null); 
    _bitmap.Invalidate(); 

    } 
+0

Trong khi điều này là đúng, nó không phải lúc nào cũng khả thi. Xem câu trả lời của tôi. – TCM

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