Добавление детей в стековую панель программно не работает - PullRequest
6 голосов
/ 13 января 2012

Кто-нибудь может заметить ошибку, которую я делаю?

Вот код:

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

Как вы можете видеть, я создаю временное изображение и затем добавляю его в панель стека, а затем создаю окончательный файл WriteableBitmap. Мои первые дети стека панели имеют рост 154 и 2-й из 389. После этой строки:

 _bitmap.Invalidate();

когда я вижу PixelHeight, это просто 389. Куда ушел мой первый ребенок?

Ответы [ 3 ]

2 голосов
/ 15 января 2012

Хотя оба ответа, данные sLedgem и bathineni, верны, это не соответствует моей ситуации.Кроме того, почему я хочу добавить их в макет?Если это удобно для вас, вы можете, но в моем случае я хочу, чтобы они были в 100% памяти, потому что мой вспомогательный класс, используемый в основном для печати, не имел никакой ссылки ни на один из UIElements, присутствующих на экране.В этом случае, очевидно, я бы не хотел передавать свой LayoutRoot или какую-либо другую Panel моему классу помощника, просто чтобы сделать этот хак!

Чтобы попросить среду выполнения Silverlight отрендерить элементы в памяти.Вам нужно вызвать Measure and Arrange:

Так что, как правило, все, чего мне не хватало, было:

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

до:

_bitmap = new WriteableBitmap(stackPanel, null);

И я могу избавиться от этой строки:

stackPanel.UpdateLayout();

Надеюсь, это поможет кому-то, кто заходит в этот поток и имеет такую ​​же проблему, как я, где невозможно найти LayoutRoot в вашем классе помощников.

0 голосов
/ 14 января 2012

bathineni правильно, вам нужно визуализировать панель стека, прежде чем делать снимок.Я хотел бы предложить ему визуализировать кадр, а затем захватить растровое изображение после того, как он отрендерил

     CompositionTarget.Rendering += CompositionTarget_Rendering;
 }

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

  }
0 голосов
/ 13 января 2012

stackPanel или любые другие панели не будут отображаться до тех пор, пока они не будут добавлены в visulatree (любой визуальный элемент) ... означает ... если вы добавили 100 элементов в стековую панель, эти 100 элементов не будут сгенерированы до тех пор, пока стековая панель не будет отображаться на экране..

Если вы не хотите показывать стековую панель на экране, добавьте стековую панель и немедленно удалите ее.это заставит стековую панель визуализировать ее как дочерние элементы ...

ИЛИ

Создать сетку или стековую панель в XAML, которая имеет высоту и ширину в 1 пиксель, и добавить вашу стековую панель к этой сетке или стековой панели ...поэтому он не будет виден на экране и будет отображаться на фоне ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...