Как захватить содержимое главного окна приложения 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">