2012-01-13 13 views
6

Yaptığım yanılgıyı bilen var mı? İşte Yığınlama penceresine çocuk yerleştirme programlı çalışmaz

kodudur:

 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(); 

ben geçici Resmi oluşturarak ve ardından bunu stackpanel ekleyerek ve daha sonra nihai WriteableBitmap oluşturma görebileceğiniz gibi. Myy stackpanel 1. çocukları yüksekliği 154 ve 2 tek bu hattın sonra 389. taşımaktadır: ben öyle PixelHeight görünce

_bitmap.Invalidate(); 

sadece 389. nerede 1 çocuk nereye gitti?

cevap

2

kılmış sonra sonra bit eşlem kapmak istiyorum. Ayrıca neden bunları mizanpaja eklemek isterim? Sizin için uygunsa, ancak benim durumumda bunların% 100 bellekte olmasını istiyorum çünkü temelde baskı için kullanılan yardımcı sınıfım ekranda bulunan UIElement'lerden herhangi birine atıfta bulunmadı. Bu durumda, sadece bu hack yapmak için LayoutRoot veya başka bir Panel yardımcım sınıfına geçmek istemem!

Silverlight çalışma zamanının öğeleri bellekte oluşturmasını istemek için. Sen ölçün arayıp düzenleyin gerekir:

_bitmap = new WriteableBitmap(stackPanel, null); 

Ve bu hattın kurtulabilirsiniz:

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

önce:

Yani tipik olarak tüm ı eksik olan

stackPanel.UpdateLayout(); 

Bu iş parçacığına gelen ve LayoutRoo'yu bulmak mümkün olmadığı durumlarda benim gibi aynı soruna sahip olan birine yardım etmesini umarım yardımcınızın sınıfında t.

+0

Eklenecek bir şey varsa, yükseklik ve genişliği yığın yığınına açıkça ayarlamaya çalışın ve 'Size' ve' Rect''i ayarlamak için bunu kullanın. –

0

stackPanel veya diğer paneller, görselliğe (görsel öğelere) ekleninceye kadar oluşmaz .. , eğer .. stackpanel'e 100 öğe eklediyseniz, stackpanel görsel görünüme sahip olana kadar bu 100 elemanın oluşturulmayacağı anlamına gelir. Ekranda stackpanel göstermek istemiyorsanız, stackpanel ekleyin ve hemen çıkarın.

o

VEYA

1 piksel yükseklik ve genişlik vardır XAML bir ızgara veya StackPanel oluşturun ve o ızgara veya StackPanel ... için StackPanel ekleyin ... o alt öğeleri işlemek StackPanel yapacak yüzden böyle olmaz ekranda görülebilir ve arka plan üzerinde işlenecektir.

+0

Cevabınız doğru ama her zaman mümkün değil. Cevabımı gör. – TCM

0

bathineni haklı, bir anlık görüntü almadan önce stackpanel render gerekir. Bunun bir çerçeveyi oluşturmak icar önermek ve sLedgem ve bathineni tarafından verilen cevaplar her iki doğru, ancak benim durum uygun görünmüyor

 CompositionTarget.Rendering += CompositionTarget_Rendering; 
} 

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

    } 
+0

Bu doğru olsa da, her zaman mümkün değildir. Cevabımı gör. – TCM