tool__ Ответов: 1

Как захватить содержимое главного окна приложения WPF на растровом изображении


Я изменил код с этой страницы:

Блог Mitesh Sureja: как захватить скриншот из приложения WPF?[^]

Потому что он, кажется, делает то, что я хочу. Я заменил обработчик нажатия кнопки клавишей вниз, а scrollViewer (которого нет в моей программе ) заменил на "Grid" и дал ему имя "gridx", как вы видите в XAML. Я также добавил сверху пространство имен: "использование системы.ИО;"

Однако в очереди
"UIElement element = gridx.Content as UIElement;"
слово "содержание" подчеркнуто красным, и на нем написано::

"Сетка" не содержит определения для "содержимого", и не может быть найден доступный метод расширения "содержимое", принимающий первый аргумент типа "сетка". (вам не хватает директивы using или реферирования сборки?)

Ребята, вы можете сказать мне, что я делаю не так?

Спасибо

Что я уже пробовал:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (linevertical.Visibility == Visibility.Hidden)
            { linevertical.Visibility = Visibility.Visible; }
            else { linevertical.Visibility = Visibility.Hidden; }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (lineo.Visibility == Visibility.Hidden)
            { lineo.Visibility = Visibility.Visible; }
            else { lineo.Visibility = Visibility.Hidden; }
        }

        private void Mainwindow_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.A)
            {
                lineo.Visibility = Visibility.Hidden;
                linevertical.Visibility = Visibility.Hidden;
            }
            if (e.Key == Key.S)
            {
                lineo.Visibility = Visibility.Visible;
                linevertical.Visibility = Visibility.Visible;

            }

            if (e.Key == Key.P)
            {
                //Set scrollviewer's Content property as UI element to capture full 
                content
                UIElement element = gridx.Content as UIElement;
                Uri path = new Uri(@"d:\temp\screenshot.png");
                CaptureScreen(element, path);
            }

        }
            public void CaptureScreen(UIElement source, Uri destination)
            {
                try
                {
                    double Height, renderHeight, Width, renderWidth;

                    Height = renderHeight = source.RenderSize.Height;
                    Width = renderWidth = source.RenderSize.Width;

                    //Specification for target bitmap like width/height pixel etc.
                    RenderTargetBitmap renderTarget = new 
                    RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, 
                    PixelFormats.Pbgra32);
                    //creates Visual Brush of UIElement
                    VisualBrush visualBrush = new VisualBrush(source);

                    DrawingVisual drawingVisual = new DrawingVisual();
                    using (DrawingContext drawingContext = 
                    drawingVisual.RenderOpen())
                    {
                        //draws image of element
                        drawingContext.DrawRectangle(visualBrush, null, new 
                        Rect(new Point(0, 0), new Point(Width, Height)));
                    }
                    //renders image
                    renderTarget.Render(drawingVisual);

                    //PNG encoder for creating PNG file
                    PngBitmapEncoder encoder = new PngBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                    using (FileStream stream = new 
                    FileStream(destination.LocalPath, FileMode.Create, 
                    FileAccess.Write))
                    {
                        encoder.Save(stream);
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }        
    }
}


код XAML

<Grid Name="gridx" Margin="0,0,0,13">

1 Ответов

Рейтинг:
7

OriginalGriff

Элемент управления Grid не имеет свойства Content: Класс ScrollViewer (System.Окна.Элементы Управления) | Microsoft Docs[^] - это часть элемента управления ScrollView, который наследуется от ContentControl. Grid не наследуется прямо или косвенно от ContentControl, поэтому у него нет и не будет свойства Content.


tool__

Спасибо, я даю имя окну x:Name="mainwindow"
и я использую это вместо этого, и ошибка исчезла, экран печати все еще не работает, но я сделаю еще один поток для новой проблемы