Sida 2 av 2

Re: Mer C# och WPF frågor

Postat: 26 januari 2017, 03:13:19
av TomasL
Fungerar ypperligt, tack.

Re: Mer C# och WPF frågor

Postat: 26 januari 2017, 16:56:10
av TomasL
Ny fråga:
Har ett fönster, i koden sparkas ett nytt fönster igång, icke modalt.
När det händer sätts vissa knappar på det ursprungliga fönstret till "Disabled"
Vad jag vill uppnå är att när användaren stänger det andra fönstret så skall dessa knappar sättas till "enabled"

Re: Mer C# och WPF frågor

Postat: 26 januari 2017, 17:00:16
av zealotry
Samma igen, gör en callback som du triggar i "on close" på det nya fönstret.

Re: Mer C# och WPF frågor

Postat: 27 januari 2017, 18:04:48
av TomasL
Nästa fråga, jag kör en snutt kod, rätt många gånger, och varje gång den körs, så käkas runt 100MB av minne upp.
Har försökt att sätta in GC.collect och ".dispose", men det verkar inte göra någon som helst nytta.

Kod: Markera allt

public static void writePDFimageFromStream(MemoryStream chartStream, int plotNum)
        {
            XGraphics gfx;
            double x = 0, y = 0;
            var img = new System.Windows.Media.Imaging.BitmapImage();
            img.BeginInit();
            img.StreamSource = chartStream;
            img.EndInit();
            PdfDocument document = PdfReader.Open(finalfilename, PdfDocumentOpenMode.Modify);
            if (document.AcroForm.Elements.ContainsKey("/NeedAppearances") == false)
            {
                document.AcroForm.Elements.Add("/NeedAppearances", new PdfBoolean(true));
            }
            else
            {
                document.AcroForm.Elements["/NeedAppearances"] = new PdfBoolean(true);
            }
            int numPages = document.PageCount;

            XImage image = XImage.FromBitmapSource(img);
            double width = image.PixelWidth;
            double hrez = image.HorizontalResolution;
            double height = image.PixelWidth;
            double vrez = image.VerticalResolution;
            switch (plotNum)
            {
                case 0:
                    gfx = XGraphics.FromPdfPage(document.Pages[2]);
                    x = 60;
                    y = 200;
                    gfx.DrawImage(image, x, y,250d,250d);
                    gfx = null;
                    //gfx.Dispose();
                    break;
                case 1:
                    gfx = XGraphics.FromPdfPage(document.Pages[2]);
                    x = 325;
                    y = 200;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx.Dispose();
                    break;
                case 2:
                    gfx = XGraphics.FromPdfPage(document.Pages[2]);
                    x = 60;
                    y = 500;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx.Dispose();
                    break;
                case 3:
                    gfx = XGraphics.FromPdfPage(document.Pages[2]);
                    x = 325;
                    y = 500;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx.Dispose();
                    break;
                case 4:
                    gfx = XGraphics.FromPdfPage(document.Pages[3]);
                    x = 60;
                    y = 200;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                  //  gfx = null;
                    gfx.Dispose();
                    break;
                case 5:
                    gfx = XGraphics.FromPdfPage(document.Pages[3]);
                    x = 325;
                    y = 200;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx = null;
             //       gfx.Dispose(); gfx = null;
                    gfx.Dispose();
                    break;
                case 6:
                    gfx = XGraphics.FromPdfPage(document.Pages[3]);
                    x = 60;
                    y = 500;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx.Dispose();
                    break;
                case 7:
                    gfx = XGraphics.FromPdfPage(document.Pages[3]);
                    x = 325;
                    y = 500;
                    gfx.DrawImage(image, x, y, 250d, 250d);
                    gfx.Dispose();
                    break;
                default:
                    break;

            }
            document.Save(finalfilename);
            

            chartStream = null;

            image.Dispose();
            document.Close();
            document.Dispose();
            
            GC.Collect();
         
            
        }
Här är den anropande koden:

Kod: Markera allt

 BitmapSource render = plotRender(pltEvapDuty1, pltEvapDuty1.ActualWidth, pltEvapDuty1.ActualWidth);
                using (MemoryStream EvapDuty1Stream = new MemoryStream())
                {
                    PngBitmapEncoder encoder = new PngBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(render));
                    encoder.Save(EvapDuty1Stream);
                    CalcPdfOutput.writePDFimageFromStream(EvapDuty1Stream, 0);
                }
Och en hjälpfunktion:

Kod: Markera allt

 private BitmapSource plotRender(Visual target, double dpiX, double dpiY)
        {
            if (target == null)
            {
                return null;
            }
            Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
            RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
                                                            (int)(bounds.Height * dpiY / 96.0),
                                                            dpiX,
                                                            dpiY,
                                                            PixelFormats.Pbgra32);
            DrawingVisual dv = new DrawingVisual();
            using (DrawingContext ctx = dv.RenderOpen())
            {
                VisualBrush vb = new VisualBrush(target);
                ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
            }
            rtb.Render(dv);
            return rtb;
        }

Re: Mer C# och WPF frågor

Postat: 27 januari 2017, 22:49:43
av papabear
Jag skulle testat ett verktyg som tex dotMemory för att se vad som händer.
https://www.jetbrains.com/dotmemory/

Jag har inte använt just dotMemory själv, men flera av deras andra produkter.

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 15:36:47
av TomasL
Nya frågor.
Jag skapar en minnesström med

Kod: Markera allt

using (MemoryStream COP2Stream = new MemoryStream())
                {
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(render));
                    encoder.Save(COP2Stream);
                    CalcPdfOutput.writePDFimageFromStream(COP2Stream, 7);
                }
I CalcPdfOutput.writePDFimageFromStream
läser jag strömmen med:

Kod: Markera allt

BitmapImage img = new BitmapImage();
            img.BeginInit();
            
            img.StreamSource = chartStream;
            img.EndInit();
Dock får jag
An unhandled exception of type 'System.IO.FileFormatException' occurred in PresentationCore.dll
Så nått fel gör jag uppenbarligen, frågan är vad.

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 16:31:19
av davidi
Resetta COP2Stream innan writePDFimageFromStream, annars finns inget att läsa från den.

COP2Stream.Position = 0;

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 16:46:11
av TomasL
Har inte behövts för png.
Om jag använder png i stället för jpeg så funkar det felfritt.

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 18:01:57
av TomasL
Löste sig, visade sig att det inte gick att använda jpg, så det blev tillbaka till nummer ett istället.

Någon som vet hur man programatiskt sätter axelskalan/maxvärdet på y-axeln i WPF chartingtoolkit.
Har letat som en liten blå, men hittar bara en massa förslag på hur man gör det i xml.

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 21:29:11
av papabear
Funkar det om man sätter ett x:Name på axeln och anväder det?

http://stackoverflow.com/questions/1637 ... amatically

Re: Mer C# och WPF frågor

Postat: 19 februari 2017, 22:07:29
av TomasL
Försökt det, men hittar ingen namn, sas.