Question

En utilisant le code ci-dessous sur lequel je m'appuie DrawingVisual puis le rendre à un Image en utilisant RenderTargetBitmap.Le final Image est ensuite ajouté à un Canvas et affiché à l'écran.

Mon problème vient du pixelWidth et pixelHeight arguments les RenderTargetBitmap la méthode veut.Quelle valeur dois-je lui accorder ?J'ai remarqué que si je lui donne des nombres inférieurs, certaines parties de l'image ne sont pas rendues.Sur quelle base dois-je les choisir ?Je lui ai donné 1000 dans le code ci-dessous.

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;
    }
}
Était-ce utile?

La solution

Vous pouvez interroger le DrawingVisual ContentBounds propriété, qui

obtient le cadre de délimitation pour le contenu de ContainerVisual

ou la DescendantBounds propriété qui

récupère l’union de toutes les boîtes englobantes de contenu pour tous les descendants du ContainerVisual, mais n’incluant pas le contenu de le ContainerVisual.

Quelque chose comme ceci devrait fonctionner :

var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
    (int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
    96, 96, PixelFormats.Pbgra32);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top