把wpf的窗体保存为png图片

昨晚在stack overflow刷问题时看到有这个问题,今天早上刚好来尝试学习一下

stack overflow的链接如下:

c# - How to render a WPF UserControl to a bitmap without creating a window - Stack Overflow

测试步骤如下:

1 新建.net framework 3.5的wpf窗体程序

2 默认的窗体的xaml代码如下:

cs 复制代码
<Window x:Class="WpfDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfDemo"
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel HorizontalAlignment="Left">
            <TextBox>123455</TextBox>
            <Button x:Name="btnEnter" Click="BtnEnter_Click" 
                    Content="确定">
            </Button>
        </StackPanel>
        
    </Grid>
</Window>

窗体效果如下:

对应的后台代码如下:

cs 复制代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnEnter_Click(object sender, RoutedEventArgs e)
        {
            RenderControl(this);
            MessageBox.Show("保存完成");
        }

        void RenderControl(Control renderControl)
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap((int)renderControl.Width, (int)renderControl.Height, 0, 0, PixelFormats.Pbgra32);

            bmp.Render(renderControl);

            var encoder = new PngBitmapEncoder();

            encoder.Frames.Add(BitmapFrame.Create(bmp));

            using (Stream stm = File.Create("test.png"))
                encoder.Save(stm);
        }
        

    }
}

3 运行程序,点击确定按钮,会在bin/Debug目录下生成MainWindow窗体对应的png图片,png图片名称为test.png,如下图:

相关推荐
冰茶_36 分钟前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
Pasregret39 分钟前
缓存与数据库一致性深度解析与解决方案
数据库·缓存·wpf
The Future is mine2 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
Iotfsd9 小时前
.NET写的开源工业物联网网关(IoTGateway)
物联网·c#·.net·dotnet·边缘网关·雾计算·工业物联网智能网关
先生沉默先9 小时前
c#接口_抽象类_多态学习
开发语言·学习·c#
江沉晚呤时9 小时前
深入了解C# List集合及两种常见排序算法:插入排序与堆排序
windows·sql·算法·oracle·c#·排序算法·mybatis
iReachers10 小时前
使用命令行加密混淆C#程序
开发语言·c#
[太阳]8810 小时前
Kafka命令行的使用/Spark-Streaming核心编程(二)
c#·linq
电商api接口开发1 天前
ASP.NET MVC 入门指南
c#·asp.net·mvc
我不是程序猿儿1 天前
[C#]反射的实战应用,实际数据模拟
开发语言·c#