Quiero guardar mi control de etiqueta, pero no tengo idea de guardarlo. Intenté dibujar texto en la clase Graphics, pero no puedo dibujar "incluso la asignación". ¿Hay alguna buena manera?

public Label makeLabel(string text, double width, double height, FontFamily fontFamily, FontStyle fontStyle, FontStretch fontStretch)
{
    var label = new Label();
    label.Width = width;
    label.Height = height;
    label.FontFamily = fontFamily;
    label.FontStyle = fontStyle;
    label.FontStretch = fontStretch;
    label.Content = text;

    return label;
}

public void SavePicture(Label label)
{
    var path = "label.png";
    // I have no idea to save;
}
0
rustynail36 13 dic. 2019 a las 10:48

2 respuestas

La mejor respuesta
public void SavePicture(Label label)
{
    var path = "label.png";

    var width = label.Width;
    var height = label.Height;

    var viewBox = new Viewbox();
    var renderTargetBitmap = new RenderTargetBitmap((int)width, (int)height, 96, 96, PixelFormats.Pbgra32);
    var pngBitmapEncoder = new PngBitmapEncoder();

    viewBox.Child = label;
    viewBox.Measure(new Size(width, height));
    viewBox.Arrange(new Rect(0, 0, width, height));
    viewBox.UpdateLayout();

    renderTargetBitmap.Render(viewBox);

    pngBitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

    using (var fileStream = File.Create(path))
    {
        pngBitmapEncoder.Save(fileStream);
    }
}

Esto funciona sin que se muestre la etiqueta en la pantalla.

0
DK Dhilip 13 dic. 2019 a las 08:33
void SavePicture(FrameworkElement el)
{
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)el.ActualWidth, (int)el.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    bitmap.Render(el);
    using (FileStream stream = File.Create(@"label.png"))
    {
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmap));
        encoder.Save(stream);
    }
}

Pero puede llamar a este método solo después de que se muestre la etiqueta.

-1
dovid 13 dic. 2019 a las 08:09