private Brush MakeBrushFromVisual(Visual visual, Rect bounds, int dpi)
        {
            var viewport3D = visual as Viewport3D;

            if (viewport3D == null)
            {
                Drawing drawing = VisualTreeHelper.GetDrawing(visual);

                if (this.drawOutlines)
                {
                    bounds.Inflate(outlinePen.Thickness / 2, outlinePen.Thickness / 2);
                }

                var offsetMatrix          = new Matrix(1, 0, 0, 1, -bounds.Left, -bounds.Top);
                var offsetMatrixTransform = new MatrixTransform(offsetMatrix);
                offsetMatrixTransform.FreezeIfPossible();

                var drawingVisual = new DrawingVisual();

                using (var drawingContext = drawingVisual.RenderOpen())
                {
                    drawingContext.PushTransform(offsetMatrixTransform);

                    if (this.drawOutlines)
                    {
                        drawingContext.DrawRectangle(null, outlinePen, bounds);
                    }

                    drawingContext.DrawDrawing(drawing);
                    drawingContext.Pop();
                }

                visual = drawingVisual;
            }

            var renderTargetBitmap = VisualCaptureUtil.RenderVisual(visual, bounds.Size, dpi, viewport3D: viewport3D);

            renderTargetBitmap.FreezeIfPossible();
            var imageBrush = new ImageBrush(renderTargetBitmap);

            imageBrush.FreezeIfPossible();

            return(imageBrush);
        }
        private void HandleSave(object sender, ExecutedRoutedEventArgs e)
        {
            var dpiText = ((TextBlock)((ComboBoxItem)this.dpiBox.SelectedItem).Content).Text;

            var filename = "SnoopScreenshot";

            if (this.DataContext is FrameworkElement element &&
                string.IsNullOrEmpty(element.Name) == false)
            {
                filename = $"SnoopScreenshot_{element.Name}";
            }

            filename += "_" + dpiText;

            filename += ".png";

            var filePath = Path.Combine(lastSaveDirectory, filename);

            var fileDialog = new SaveFileDialog
            {
                AddExtension     = true,
                CheckPathExists  = true,
                DefaultExt       = "png",
                InitialDirectory = Path.GetDirectoryName(filePath),
                FileName         = Path.GetFileNameWithoutExtension(filePath),
                Filter           = "Image File (*.png)|*.png",
                FilterIndex      = 0
            };

            if (fileDialog.ShowDialog(this).Value)
            {
                lastSaveDirectory = Path.GetDirectoryName(fileDialog.FileName);

                VisualCaptureUtil.SaveVisual(this.DataContext as Visual,
                                             int.Parse(dpiText),
                                             filePath);

                this.Close();
            }
        }