Добавление дочерних элементов в 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();

  }