Генерация изображения из Silverlight 4 XAML на стороне сервера без рендеринга пользовательского интерфейса в браузере - PullRequest
4 голосов
/ 12 июля 2011

В настоящее время я пытаюсь реализовать некоторые функции отчетности, которые требуют от меня преобразования содержимого XAML Silverlight в изображения без фактического создания пользовательского интерфейса на клиенте Silverlight.

Проблема, которую я пытаюсь решить, заключается в следующем: как я могу отобразить Silverlight XAML как изображение без его предварительного отображения в клиенте Silverlight? Единственный раз, когда я делал это раньше, было использование API WriteableBitmap для рендеринга отображаемого в настоящее время пользовательского интерфейса в виде изображения, а затем преобразования в формат PNG / JPEG в зависимости от ситуации. Поскольку у меня есть опция рендеринга серверной части XAML, я надеялся использовать функциональность WPF для рендеринга XAML - но так как это Silverlight XAML, это будет работать?

Если нет хорошего способа сделать это, то, насколько я вижу, есть еще один вариант - попытаться отрисовать скрытый пользовательский интерфейс в фоновом режиме клиентского элемента управления Silverlight средства просмотра PDF, получить растровое изображение для записи и сгенерировать его таким образом. но очевидно, что при таком подходе накладные расходы не идеальны ...

Любые мысли по этому поводу приветствуются, это заставляет меня чесать голову последние пару дней!

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Я бы попробовал использовать среду выполнения WPF для рендеринга XAML и генерирования BMP из этого. Обычно XAML, который работает в Silverlight, будет работать в WPF, хотя обратное не всегда верно.

WPF должен позволять программно создавать экземпляры элементов управления или загружать свободный XAML. Затем вы можете сказать ему обновить макет и, наконец, записать изображение в растровое изображение.

EDIT

Чтобы получить xaml на сервере, я бы порекомендовал вам создать новый проект библиотеки классов WPF в своем решении. Затем «Добавить существующие» элементы в этот проект и выберите, чтобы добавить нужные файлы xaml в качестве «связанного» файла, а не копировать их. Таким образом, вы можете поделиться одним файлом между проектами silverlight и wpf.

Скомпилируйте эту DLL и используйте ее на сервере в службе или на странице, которая будет возвращать вывод изображения. На этой странице создайте экземпляр пользовательского элемента управления, задайте текстовый текст данных и выведите изображение. Для захвата изображения из визуала вы можете использовать RenderTargetBitmap.

Вот фрагмент:

var arrangeSize = new Size(300, 300);
var arrangeRect = new Rect(new Point(0, 0), arrangeSize);

var control = new MyControl();
control.DataContext = new MyViewModel();
control.Measure(arrangeSize);
control.Arrange(arrangeRect);
control.InvalidateVisual();
control.UpdateLayout();

RenderTargetBitmap renderTarget =
    new RenderTargetBitmap(
        arrangeSize.X,
        arrangeSize.Y,
        96,
        96,
        System.Windows.Media.PixelFormats.Default
    );

renderTarget.Render(control);

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTarget));

using (var pageOutStream = new FileStream(targetSavePath + ".png", FileMode.Create, FileAccess.Write))
{
    encoder.Save(pageOutStream);
    pageOutStream.Close();
}
2 голосов
/ 12 июля 2011

Необычный запрос ... что может удовлетворить ваши цели - это Chromium, и, в частности, некоторые из .Net-оболочек для него. Вы можете создать его экземпляр в памяти, отобразить на нем HTML-страницу (включая Silverlight), а затем представить ее в виде изображения (эта функциональность встроена в оболочки). Теперь это означает, что вы по-прежнему «скачиваете» и «рендеринге» страницы, но вы также заявляете, что делать это на стороне сервера можно.

Мне известны две обертки Chromium Awesomium и Troymium . Awesomium профессионально разработан и имеет достаточно привлекательную модель лицензирования инди, в то время как Troymium все еще находится на стадии бета-тестирования и, возможно, не настолько зрел, но имеет более обширную оболочку (и в настоящее время является бесплатной). В состав Awesomium входит пример загрузки веб-страницы и ее рендеринга в изображение.

Обратите внимание, что вы не сможете использовать какие-либо функции WPF, Silverlight использует отдельную среду выполнения.

0 голосов
/ 08 августа 2011

После долгих попыток и неудач я решил просто перейти к визуализации интерфейса с использованием GDI на стороне сервера.

Потратил слишком много времени, пытаясь заставить это с Silverlight, спасибо за все предложения, ребята.

...