Frage

Mit dem folgenden Code zeichne ich auf DrawingVisual dann rendern Sie es zu einem Image wobei RenderTargetBitmap.Endgültig Image wird später zu einem hinzugefügt Canvas und auf dem Bildschirm angezeigt.

Mein Problem ist mit dem pixelWidth und pixelHeight argumente die RenderTargetBitmap methode will.Welchen Wert soll ich ihm geben?Mir ist aufgefallen, dass bei niedrigeren Zahlen Teile des Bildes nicht gerendert werden.Auf welcher Grundlage sollte ich diese auswählen?Ich habe es 1000 im folgenden Code angegeben.

public class ModelBeamSectionNamesInPlan : Image
{
    private readonly VisualCollection _visuals;
    public ModelBeamSectionNamesInPlan(BaseWorkspace space)
    {
        var typeface = Settings.BeamTextTypeface;
        var cultureinfo = Settings.CultureInfo;
        var flowdirection = Settings.FlowDirection;
        var beamtextsize = Settings.BeamTextSize;
        var beamtextcolor = Settings.InPlanBeamTextColor;

        beamtextcolor.Freeze();
        const double scale = 0.6;

        var drawingVisual = new DrawingVisual();
        using (var dc = drawingVisual.RenderOpen())
        {
            foreach (var beam in Building.ModelBeamsInTheElevation)
            {
                var text = beam.Section.Id;
                var ft = new FormattedText(text, cultureinfo, flowdirection,
                                           typeface, beamtextsize, beamtextcolor,
                                           null, TextFormattingMode.Display)
                {
                    TextAlignment = TextAlignment.Center
                };

                // Draw Text
                dc.DrawText(ft, space.FlipYAxis(x, y));
            }
        }

        var bmp = new RenderTargetBitmap(1000, 1000, 120, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);
        Source = bmp;
    }
}
War es hilfreich?

Lösung

Sie können die DrawingVisual's abfragen ContentBounds eigentum, das

ruft den Begrenzungsrahmen für den Inhalt des ContainerVisual ab

oder die DescendantBounds eigentum, das

ruft die Vereinigung aller Inhaltsbegrenzungsrahmen für alle ab nachkommen des Containervisuals, jedoch ohne den Inhalt von der Containervisuell.

So etwas sollte funktionieren:

var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
    (int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
    96, 96, PixelFormats.Pbgra32);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top