You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WinForm调用.NET MAUI程序自定义QRCode生成文件名?

WinForm调用.NET MAUI生成自定义文件名二维码的实现方案

完全可行,但需要改造.NET MAUI程序,让它支持命令行参数触发二维码生成,而不是仅依赖UI按钮点击。以下是具体步骤:

1. 改造.NET MAUI程序,支持命令行调用

封装二维码生成逻辑

把二维码生成和保存的代码封装成独立的静态方法,脱离UI按钮的依赖:

using System.IO;
using SkiaSharp;
using ZXing.Net.Maui;
using ZXing.Common;

public static class QRCodeHelper
{
    // 传入二维码内容和完整保存路径,直接生成并保存
    public static void GenerateQRCode(string content, string fullSavePath)
    {
#if WINDOWS
        // 生成二维码像素数据
        var writer = new BarcodeWriterPixelData
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new EncodingOptions
            {
                Width = 300,
                Height = 300,
                Margin = 1
            }
        };
        var pixelData = writer.Write(content);

        // 转换为PNG字节并保存
        using var stream = new MemoryStream();
        using var bitmap = new SKBitmap(pixelData.Width, pixelData.Height);
        bitmap.Pixels = pixelData.Pixels;
        using var image = SKImage.FromBitmap(bitmap);
        using var data = image.Encode(SKEncodedImageFormat.Png, 100);
        
        data.SaveTo(stream);
        File.WriteAllBytes(fullSavePath, stream.ToArray());
#endif
    }
}

修改MAUI入口,处理命令行参数

修改Program.cs,让程序启动时先检查命令行参数,如果有参数则直接生成二维码并退出,不启动UI:

namespace YourMauiAppName;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp(string[] args)
    {
        // 优先处理命令行参数:第一个参数是二维码内容,第二个是保存路径
        if (args.Length >= 2)
        {
            string qrContent = args[0];
            string savePath = args[1];
            QRCodeHelper.GenerateQRCode(qrContent, savePath);
            Environment.Exit(0); // 生成完成直接退出
        }

        // 原MAUI初始化逻辑(保留UI模式)
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        return builder.Build();
    }

    [STAThread]
    public static void Main(string[] args)
    {
        var app = CreateMauiApp(args);
        app.Run();
    }
}

2. 打包MAUI程序为可执行文件

右键MAUI项目 → 选择发布 → 目标平台选Windows,打包生成独立的exe文件(建议选择"单文件"模式,方便调用)。

3. WinForm端调用MAUI程序

在WinForm的按钮点击事件中,获取文本框的文件名,拼接完整保存路径,通过Process启动MAUI的exe并传递参数:

using System.Diagnostics;
using System.IO;

private void btnGenerateQR_Click(object sender, EventArgs e)
{
    string mauiExePath = @"C:\发布路径\YourMauiApp.exe"; // MAUI exe的实际路径
    string qrContent = "需要生成二维码的内容"; // 可改为从WinForm的文本框获取
    string fileName = txtFileName.Text.Trim();

    // 校验文件名
    if (string.IsNullOrEmpty(fileName))
    {
        MessageBox.Show("请输入文件名");
        return;
    }
    if (!fileName.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
    {
        fileName += ".png";
    }

    // 拼接完整保存路径
    string savePath = Path.Combine(@"C:\my\file\path", fileName);

    // 启动MAUI程序
    var startInfo = new ProcessStartInfo
    {
        FileName = mauiExePath,
        Arguments = $"\"{qrContent}\" \"{savePath}\"", // 传递参数(带引号避免路径有空格)
        UseShellExecute = false,
        CreateNoWindow = true // 不显示MAUI的UI窗口
    };

    try
    {
        using var process = Process.Start(startInfo);
        process.WaitForExit();
        MessageBox.Show(process.ExitCode == 0 ? "二维码生成成功" : "二维码生成失败");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"调用失败:{ex.Message}");
    }
}

为什么之前尝试失败?

你之前的MAUI程序仅在UI按钮点击时触发生成逻辑,没有提供外部调用的入口。改造后通过命令行参数直接触发生成逻辑,无需依赖UI交互,就能被WinForm正常调用。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:27:07