Mer C# och WPF frågor

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Fungerar ypperligt, tack.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg 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"
zealotry
Inlägg: 918
Blev medlem: 9 oktober 2004, 22:28:40
Ort: Västerås

Re: Mer C# och WPF frågor

Inlägg av zealotry »

Samma igen, gör en callback som du triggar i "on close" på det nya fönstret.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg 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;
        }
Användarvisningsbild
papabear
Inlägg: 821
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: Mer C# och WPF frågor

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg 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.
davidi
Inlägg: 571
Blev medlem: 13 oktober 2011, 16:45:38
Ort: Ekerö

Re: Mer C# och WPF frågor

Inlägg av davidi »

Resetta COP2Stream innan writePDFimageFromStream, annars finns inget att läsa från den.

COP2Stream.Position = 0;
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Har inte behövts för png.
Om jag använder png i stället för jpeg så funkar det felfritt.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg 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.
Användarvisningsbild
papabear
Inlägg: 821
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av papabear »

Funkar det om man sätter ett x:Name på axeln och anväder det?

http://stackoverflow.com/questions/1637 ... amatically
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Försökt det, men hittar ingen namn, sas.
Skriv svar