none
Silverlight сохранение скрина страницы RRS feed

  • Вопрос

  • Всем доброго времени суток.

    Моя проблема заключается в том, что когда я хочу сохранить рисунок canvas в JPEG.

    Я сначала создаю Bitmap, а потом перевожу в JPEG, используя FJ.Core.

    В принципе делается это так:

    // Создаём bitmap

    WriteableBitmap bmp = new WriteableBitmap((int)cnv.ActualWidth, (int)cnv.ActualHeight);

    bmp.Render(cnv, cnv.RenderTransform);

    bmp.Invalidate();

    // Сохранение файла

    if (bmp != null)

    {

    SaveFileDialog saveDlg = new SaveFileDialog();

    saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";

    saveDlg.DefaultExt = ".jpeg";

    // Открытие диалогового окна сохранения

    if ((bool)saveDlg.ShowDialog())

    using (Stream fs = saveDlg.OpenFile())

    {

    // Сохранение с конвертированием в формат JPEG

    SaveToFile(bmp, fs);

    }

    }

    На канве картинка создаётся с использование различных объектов(line, UserControl, image, rectange). В UserControl есть и image, и надписи, и grid с разметкой, и используется стиль оформления.

    Всё вроде как хорошо должно быть и на канве всё отображается, но проблема заключается в том, что при сохранении напрочь теряются все grid с разметкой и стили в UserControl. В результате от контрола остаётся только image сведённые в одну точку.

    Подскажите как с этим можно справится.

    2 марта 2011 г. 12:56

Ответы

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

    Нашлось простое решение данной проблемы:

    cnv.UpdateLayout();

    Благодаря этому и происходит загрузка всех контролов и их разметки.

    То есть теперь просто пишем так и будет вам счастье, и мне тоже :)

    // Создаём UserControl

    SilverlightControlSample sc = new SilverlightControlSample();

    // Устанавливаем положение

    sc.Margin = new Thickness(0, 50, 0, 0);

    // Добавляем на канву

    cnv.Children.Add(sc);

    // Обновляем

    cnv.UpdateLayout();

    // Создаём bitmap

    WriteableBitmap bmp = new WriteableBitmap(cnv, null);

    // Сохранение файла

    if (bmp != null)

    {

    SaveFileDialog saveDlg = new SaveFileDialog();

    saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";

    saveDlg.DefaultExt = ".jpeg";

    // Открытие диалогового окна сохранения

    if ((bool)saveDlg.ShowDialog())

    using (Stream fs = saveDlg.OpenFile())

    {

    // Сохранение с конвертированием

    SaveToFile(bmp, fs);

    }

    }

    Некоторые замечания по сохранению:

    - не пытайтесь создавать канву и добавлять в неё и сразу сохранять, результат: проблема с разметкой;

    - если у канвы стоит Visibility = Collapsed, результат аналогичный.

    • Помечено в качестве ответа DokSergey 3 марта 2011 г. 14:25
    3 марта 2011 г. 14:24