dotnet / wpf

WPF is a .NET Core UI framework for building Windows desktop applications.
MIT License
7.05k stars 1.17k forks source link

[Question] [XPS] Drawing a Visual is always being rasterized #4466

Open wstaelens opened 3 years ago

wstaelens commented 3 years ago

XPS: When drawing a Visual on a DrawingContext of a FixedPage, the image is being rasterized and losing the Vector quality.

DrawingContextWrapper cntxt;
Visual visualToDraw;
// ...

var drawing = VisualTreeHelper.GetDrawing(visualToDraw); // <-- vector
System.Windows.Media.ImageSource image = new DrawingImage(drawing); 
cntxt.Canvas.DrawImage(image, drawingBounds.ToRect()); // <-- raster

How to draw a Visual on a DrawingContext as a vector without it being rasterized (XPS)?

(found something related but not really the same: https://stackoverflow.com/questions/6490576/wpf-image-vector-format-export-xps/ )

miloush commented 3 years ago

Do you have a simple repro? Does adding the visual directly to the FixedPage instead of rendering it on its DrawingContext work for you? (I tried with an ellipse but it looked vector in a DocumentViewer)

wstaelens commented 3 years ago

I don't have a separate solution with a small repro but the code already posted above shows the problem.

  1. First you have to open an XPS document
  2. Get a FixedPage from the document
  3. Pass that FixedPage as a visual to the code below
  4. The code below takes the vector drawing via the VisualTreeHelper.GetDrawing. When we try to draw the Visual on a different DrawingContext of a different FixedPage it gets rasterized.
    When drawing the Visual on the same DrawingContext of the FixedPage it is Vector/good quality.
    
    DrawingContextWrapper cntxt;
    Visual visualToDraw;
    // ...

var drawing = VisualTreeHelper.GetDrawing(visualToDraw); // <-- vector System.Windows.Media.ImageSource image = new DrawingImage(drawing); cntxt.Canvas.DrawImage(image, drawingBounds.ToRect()); // <-- raster

wstaelens commented 2 years ago

any updates?

wstaelens commented 2 years ago

🥱