Добавление дочерних элементов в stackpanel программно не работает
может ли кто-нибудь заметить ошибку, которую я делаю?
вот код:
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();
Как вы можете видеть, я создаю временное изображение, а затем добавляю его в stackpanel, а затем создаю окончательный WriteableBitmap. Мой 1-й ребенок из stackpanel имеет рост 154, а 2-й-389. После этой строки:
_bitmap.Invalidate();
когда я вижу PixelHeight это просто 389. Куда делся мой первый ребенок?
3 ответов
хотя оба ответа, данные следжемом и батинени, верны, это, похоже, не соответствует моей ситуации. Кроме того, зачем мне добавлять их в макет? Если вам удобно, вы можете, но в моем случае я хочу, чтобы они были в 100% памяти, потому что мой вспомогательный класс, используемый в основном для печати, не имел никакой ссылки на какие-либо из UIElements, присутствующих на экране. В этом случае, очевидно, я не хотел бы передавать свой LayoutRoot или какую-либо другую панель моему вспомогательному классу, чтобы сделать это Хак!
чтобы попросить среду выполнения Silverlight отобразить элементы в памяти. Вам нужно позвонить в Measure и договориться:
поэтому обычно все, что мне не хватало:
stackPanel.Measure(new Size(width, height));
stackPanel.Arrange(new Rect(0, 0, width, height));
перед:
_bitmap = new WriteableBitmap(stackPanel, null);
и я могу избавиться от этой строки:
stackPanel.UpdateLayout();
надеюсь, что это поможет кому-то, кто приходит в эту тему и имеет ту же проблему, что и я, где невозможно найти LayoutRoot в вашем вспомогательном классе.
stackPanel или любые другие панели не будут отображаться, пока они не будут добавлены в visulatree (любой визуальный элемент).. средства.. если вы добавили 100 элементов в stackpanel, эти 100 элементов не будут созданы до тех пор, пока stackpanel не появится на экране..
Если вы не хотите показывать stackpanel на экране, добавьте stackpanel и немедленно удалите его. это заставит stackpanel отображать дочерние элементы...
или
создайте сетку или stackpanel в XAML который имеет высоту и ширину 1 пикселя и добавляет вашу stackpanel к этой сетке или stackpanel ... таким образом, он не будет виден на экране, и он будет отображаться на фоне....
bathineni прав, вам нужно отобразить stackpanel перед тем, как сделать снимок. Я бы предложил позволить ему визуализировать кадр, а затем захватить растровое изображение после его визуализации
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
_bitmap = new WriteableBitmap(stackPanel, null);
_bitmap.Invalidate();
}