Announcement

Collapse
No announcement yet.

Zufällige App Crashes beim Drucken aus WPF

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zufällige App Crashes beim Drucken aus WPF

    Ich habe eine WPF Anwendung, welche Diagramme darstellt. Diese Diagramme bestehen ihrerseits aus hunderten von WPF Elementen. Soll ein solches Diagramm ausgedruck werden, so wird das Diegramm erneut im Speicher erstellt, anschliessend nach XPS konvertiert und schliesslich an den Drucker gesendet. Dies funktioniert soweit immer.
    Nun besteht jedoch bei manschen Windows 7 64 Bit Installationen das Problem, dass beim Drucken seltsame Probleme auftreten. Diese Probleme treten aber weder immer, noch zuverlässig reproduzierbar auf, sondern wirken zufällig. In etwa 3/4 aller Druckversuche (immer genau der gleiche Ablauf, das gleiche Diagramm) tritt einer der folgenden vier Fehler auf:

    1. "SelecClipRgn failed". Tritt dieser Fehler auf, so wird die Anwendung direkt geschlossen. Es ist nicht möglich den Fehler im Code abzufangen auch nicht mit dem Debugger.
    selectcliprgn.jpg

    2. "Win32-Fehler: Das Handle ist ungültig." Dieser Fehler ist recht selten, kann jedoch abgefangen werden.

    3. "{Int32 Polygon(Microsoft.Internal.GDIExporter.GdiSafeDCHa ndle, Microsoft.Internal.GDIExporter.PointI*, Int32)}" Auch diese Fehler kann abgefangen werden. Er enthält den folgenden Stack Trace:

    -2147467259

    bei Microsoft.Internal.GDIExporter.CNativeMethods.Poly gon(GdiSafeDCHandle hdc, PointI* pPoints, Int32 nCount)
    bei Microsoft.Internal.GDIExporter.CGDIDevice.Polygon( PointI[] pPoints, Int32 offset, Int32 nCount)
    bei Microsoft.Internal.GDIExporter.CGDIPath.Fill(CGDID evice dc, GdiSafeHandle brush)
    bei Microsoft.Internal.GDIExporter.CGDIRenderTarget.Fi llPath(GeometryProxy geometry, Brush pFillBrush)
    bei Microsoft.Internal.GDIExporter.CGDIRenderTarget.Dr awGeometry(Brush brush, Pen pen, Brush strokeBrush, Geometry geometry)
    bei Microsoft.Internal.AlphaFlattener.BrushProxyDecomp oser.Microsoft.Internal.AlphaFlattener.IProxyDrawi ngContext.DrawGeometry(BrushProxy brush, PenProxy pen, Geometry geometry, Geometry clip, Matrix brushTrans, ProxyDrawingFlags flags)
    bei Microsoft.Internal.AlphaFlattener.PrimitiveRendere r.DrawGeometry(Geometry cur, String desp, GeometryPrimitive gp)
    bei Microsoft.Internal.AlphaFlattener.Flattener.AlphaR ender(Primitive primitive, List`1 overlapping, Int32 overlapHasTransparency, Boolean disjoint, String desp)
    bei Microsoft.Internal.AlphaFlattener.Flattener.AlphaF latten(IProxyDrawingContext dc, Boolean disjoint)
    bei Microsoft.Internal.AlphaFlattener.Flattener.Conver t(Primitive tree, ILegacyDevice dc, Double width, Double height, Double dpix, Double dpiy, Nullable`1 quality)
    bei Microsoft.Internal.AlphaFlattener.MetroToGdiConver ter.FlushPage()
    bei System.Windows.Xps.Serialization.NgcSerializationM anager.EndPage()
    bei System.Windows.Xps.Serialization.NgcDocumentPageSe rializer.SerializeObject(Object serializedObject)
    bei System.Windows.Xps.Serialization.NgcDocumentPagina torSerializer.SerializeObject(Object serializedObject)
    bei System.Windows.Xps.Serialization.NgcSerializationM anager.SaveAsXaml(Object serializedObject)
    bei System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Ob ject serializedObject, Boolean isSync)
    bei System.Windows.Controls.PrintDialog.PrintDocument( DocumentPaginator documentPaginator, String description)
    bei MyCompany.MyApp.Commands.UI.PrintPatientAnalysisVi ewCommand.Execute(Object parameter) in c:\tfs\MyApp\MyApp_Main\MyApp\Commands\UI\PrintPat ientAnalysisViewCommand.cs:Zeile 142.

    4. Der häufigste Fehler ist jedoch folgender: Auf den ersten Blick hat alles funktioniert. Kein Absturz, keine Fehlermeldung. Wenn man sich dann jedoch das ausgedruckte Dokument ansieht, so ist in den meisten (nicht in allen!) Fällen nicht das komplette Dokument gedruckt worden, sondern es wurde an einer beliebigen stelle abgebrochen. Manchmal werden nur die ersten paar cm gedruckt, manchmal fast alles bis auf die letzten cm.

    Hat jemand schon etwas ähnliches erlebt oder hat eine Idee, wie das Problem zu lösen wäre. Ich bin nun seit Tagen dran und habe keine Ideen mehr.

    Danke und Gruss
    Thomas

  • #2
    Offenbar wurde dieser Bug bereits an Microsoft gemeldet. Scheint nur niemanden zu kümmern:
    https://connect.microsoft.com/Visual...documentviewer

    Comment


    • #3
      In dem Fall würde ich raten einfach mal einen Support Case bei Microsoft zu öffnen.

      Comment


      • #4
        Originally posted by Flück View Post
        Offenbar wurde dieser Bug bereits an Microsoft gemeldet. Scheint nur niemanden zu kümmern:
        https://connect.microsoft.com/Visual...documentviewer
        Doch. Hat man. Man hat gesagt das man diesen Bug nicht als relevant ansieht und sich lieber um die sonstigen Fehler in WPF kümmert die mehr User betrifft.

        Comment


        • #5
          So, schlussendlich hab ich es doch noch geschafft :-)

          Vor dem Druck wandle ich die besonders komplexen WPF Bestandteile in ein Bitmap mit derselben Grösse um. Danach werden sie entfernt und durch das eben im Speicher erzeugte Bitmap ersetzt. So kann die Komplexität des resultierenden XPS Dokuments signifikant reduziert werden und es kann wieder problemlos aus Windows 7 gedruckt werden.

          RenderTargetBitmap rtb = new RenderTargetBitmap((int)diagramGrid.ActualWidth, (int)diagramGrid.ActualHeight, 96, 96, PixelFormats.Default);
          rtb.Render(diagramGrid);
          Image image = new Image { Source = rtb };
          mainGrid.Children.Remove(mainGrid.Children[0]);
          mainGrid.Children.Add(image);

          Grüsse Thomas

          Comment

          Working...
          X