سؤال

أحاول خلق بعض البياني الصور دون عرض تلك المخططات على الشاشة.لقد ذاقت في هذا لفترة طويلة و حاول الكثير من أشياء مختلفة ولكن لا يبدو أن العمل.الكود يعمل تماما لو عرض الرسم البياني في النافذة الأولى ، ولكن إذا كان لا يتم عرض في نافذة الصورة النقطية هو مجرد الأبيض مع الأسود الحدود (أي فكرة لماذا).

لقد حاولت إضافة جدول إلى الحدود قبل التقديم وإعطاء الحدود الأخضر borderBrush.في الصورة النقطية أرى الأخضر borderBrush ثم الحدود السوداء و خلفية بيضاء ولكن لا الرسم البياني.المخطط لم ترد في الأسود التلميذ لذلك أنا لا أعرف من أين هو قادم من.

لقد حاولت إضافة جدول إلى نافذة دون استدعاء نافذة.عرض() و مرة أخرى أنا فقط الحصول على التلميذ و خلفية بيضاء.ومع ذلك إذا كنت استدعاء نافذة.عرض() نقطية تحتوي على الرسم البياني.

لقد حاولت استخدام drawingVisual كما هو موضح هنا, نفس النتيجة.

هنا هو رمز (لا بما في ذلك إضافة عنصر إلى الحدود أو نافذة):

private static BitmapSource CreateElementScreenshot(FrameworkElement element, int dpi)
{
    if (!element.IsMeasureValid)
    {
        Size size = new Size(element.Width, element.Height);
        element.Measure(size);
        element.Arrange(new Rect(size));
    }

    element.UpdateLayout();

    var scale = dpi/96.0;

    var renderTargetBitmap = new RenderTargetBitmap
        (
            (int)(scale * element.RenderSize.Width),(int)(scale * element.RenderSize.Height),dpi,dpi,PixelFormats.Default
        );

    // this is waiting for dispatcher to perform measure, arrange and render passes
    element.Dispatcher.Invoke(((Action)(() => renderTargetBitmap.Render(element))), DispatcherPriority.Render);

    return renderTargetBitmap;
}

ملاحظة:المخطط هو ContentControl.

هناك على أية حال أنا يمكن الحصول على الرسم البياني لتقديم دون عرضها في نافذة أولا ؟

هل كانت مفيدة؟

المحلول

استدعاء عنصر.ApplyTemplate() لم خدعة.

نصائح أخرى

بالنسبة لي ، داعيا عنصر.ترتيب() كان القطعة المفقودة.

إذا كان شخص ما يعاني من مشاكل مشابهة مع التقديم RenderTargetBitmap (الحصول على بيضاء / صورة فارغة) البنود التي هي في StackPanel يمكنك المؤقتة نقلها إلى الشبكة, ثم تجعل ووضعها مرة أخرى في StackPanel

Grid grid = new System.Windows.Controls.Grid() { Background = Brushes.White, Width = iWidth, Height = iHeight };
Panel panel = plot.Parent as Panel;

if (panel != null)
{
    panel.Children.Remove(plot);
    grid.Children.Add(plot);

    grid.Measure(new Size(iWidth, iHeight));
    grid.Arrange(new Rect(new Size(iWidth, iHeight)));
}
plot.Measure(new Size(iWidth, iHeight));
plot.Arrange(new Rect(new Size(iWidth, iHeight)));

plot.ApplyTemplate();
plot.UpdateLayout();

grid.ApplyTemplate();
grid.UpdateLayout();

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(
    iWidth,
    iHeight,
    96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(grid);

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

MemoryStream memoryStream = new MemoryStream();
encoder.Save(memoryStream);
bitmap = new System.Drawing.Bitmap(memoryStream);

if (panel != null)
{
    grid.Children.Remove(plot);
    panel.Children.Add(plot);
}

plot.Measure(new Size(iWidthBefore, iHeightBefore));
plot.Arrange(new Rect(new Size(iWidthBefore, iHeightBefore)));
plot.UpdateLayout();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top