2016-06-22 2 views
2

Я генерация JPG с визуальной помощью следующего кода (скажите мне ссылку, если вы знаете):Что такое VisualOffset?

var target = new RenderTargetBitmap((int)element.RenderSize.Width, (int)element.RenderSize.Height, 96, 96, PixelFormats.Pbgra32); 
target.Render(element); 
var jpg = new JpegBitmapEncoder() { QualityLevel = quality }; 
jpg.Frames.Add(BitmapFrame.Create(target)); 

Это прекрасно работает для одного визуальных, но и для другого вдруг выглядит сдвинуто с черным фоном. Вот эскиз (я не могу показать реальное изображение):

После установки точки останова на target.Render(element) я случайно запятнать есть это свойство называется VisualOffset:

Его значение является точным, как смещение визуального.

Что это? Как изменить его значение (это protected)? Как я могу создать jpg из визуального без этой проблемы? Это может быть связано с анимациями или шаблонами данных?

+1

Посмотрите [здесь] (https://blogs.msdn.microsoft.com/jaimer/2009/07/03/rendertargetbitmap-tips/). Здесь важны следующие разделы: Rect bounds = VisualTreeHelper.GetDescendantBounds (target); 'и' DrawingVisual dv = new DrawingVisual(); '. –

+0

@ Nitro.de, это звучит как уродливое, но решение. Если вы опубликуете его в качестве ответа, я обещаю проголосовать за него. Не уверен в его принятии (отражение выглядит одинаково * плохим *, как создание другого визуального и рисования в нем с помощью VisualBrush). – Sinatr

+0

Если вы посмотрите на [msdn] (https://msdn.microsoft.com/de-de/library/system.windows.media.imaging.rendertargetbitmap (v = vs.110) .aspx), они используют «DrawingVisual» тоже. –

ответ

1

В настоящее время я могу это исправить с тупым отражением:

element.GetType().GetProperty("VisualOffset", 
    BindingFlags.NonPublic | BindingFlags.Instance).SetValue(element, new Vector()); 
target.Render(element); 

Это работает, но я сомневаюсь, что последствия.

Смежные вопросы