如何在 WPF 中构建二维码扫描器

This article was translated from English: Does it need improvement?
Translated
View the article in English

Windows Presentation Foundation (WPF) 是一个 .NET Framework,用于构建采用 XAML 定义用户界面的 Windows 桌面应用程序。 IronQR 可直接集成到 WPF 中,仅需几行 C# 代码即可实现对用户选定图像文件的二维码扫描。

在本指南中,我们将构建一个 WPF 应用程序,该应用程序将打开文件对话框,加载选定的图像,并使用 IronQR 解码其中的任何嵌入式二维码。 该方案支持 PNG、JPEG、BMP、GIF、TIFF 及其他常见图像格式。

前提条件

  1. 安装了 .NET 桌面开发工作负载的 Visual Studio 2022
  2. 针对 .NET 8 或更高版本的 WPF 项目

安装 IronQR

请通过 Visual Studio 中的 NuGet 包管理器控制台安装 IronQR 库。 请转至"工具">"NuGet 包管理器">"包管理器控制台",并运行:

Install-Package IronQR

或者,在 NuGet 上搜索 IronQR 并安装最新版本。

WPF 窗口布局

扫描器界面使用 Button 触发文件对话框,并使用 TextBlock 显示解码结果。 请在 MainWindow.xaml 中添加以下标记:

<StackPanel Margin="28" VerticalAlignment="Center">

    <TextBlock Text="WPF QR Code Scanner" FontSize="20" FontWeight="Bold" Margin="0,0,0,16"/>

    <Button x:Name="ScanButton"
            Content="Select Image and Scan QR Code"
            Click="OnScanButtonClicked"
            Padding="12,8"
            Margin="0,0,0,16"
            HorizontalAlignment="Left"/>

    <TextBlock x:Name="ResultLabel"
               Text="Select an image to scan."
               TextWrapping="Wrap"
               FontSize="14"/>

</StackPanel>
<StackPanel Margin="28" VerticalAlignment="Center">

    <TextBlock Text="WPF QR Code Scanner" FontSize="20" FontWeight="Bold" Margin="0,0,0,16"/>

    <Button x:Name="ScanButton"
            Content="Select Image and Scan QR Code"
            Click="OnScanButtonClicked"
            Padding="12,8"
            Margin="0,0,0,16"
            HorizontalAlignment="Left"/>

    <TextBlock x:Name="ResultLabel"
               Text="Select an image to scan."
               TextWrapping="Wrap"
               FontSize="14"/>

</StackPanel>
XML

示例输入

请使用下方的二维码作为测试图片。 将其保存到设备中,通过文件对话框选中该文件,然后点击"选择图片并扫描二维码"。 解码后的值应显示为 https://ironsoftware.com

Sample QR code encoding https://ironsoftware.com for testing the WPF QR scanner

示例二维码 — 编码地址:`https://ironsoftware.com`

使用 IronQR 扫描二维码

点击按钮后,OnScanButtonClicked 将打开文件对话框以选择图片。 选定的文件被加载到 AnyBitmap 中,传递给 QrReader.Read,并将第一个解码后的值写入 ResultLabel

将以下 OnScanButtonClicked 方法添加到 MainWindow.xaml.cs 中:

:path=/static-assets/qr/content-code-examples/get-started/wpf-qr-code-scanner.cs
using IronQr;
using IronSoftware.Drawing;
using Microsoft.Win32;
using System.Windows;

private void OnScanButtonClicked(object sender, RoutedEventArgs e)
{
    // Open a file dialog to select a QR code image
    var dialog = new OpenFileDialog
    {
        Title = "Select a QR code image",
        Filter = "Image Files|*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tiff"
    };

    if (dialog.ShowDialog() != true) return;

    var imageSource = dialog.FileName;

    // Load the image into IronQR
    var inputBmp = AnyBitmap.FromFile(imageSource);

    // Load the asset into QrImageInput
    QrImageInput imageInput = new QrImageInput(inputBmp);

    // Create a QR Reader object
    QrReader reader = new QrReader();

    // Read the input and get all embedded QR Codes
    IEnumerable<QrResult> results = reader.Read(imageInput);

    // Display the first result
    var firstResult = results.FirstOrDefault();
    ResultLabel.Text = firstResult != null
        ? "Scanned Text: " + firstResult.Value
        : "No QR code found in the selected image.";
}
Imports IronQr
Imports IronSoftware.Drawing
Imports Microsoft.Win32
Imports System.Windows

Private Sub OnScanButtonClicked(sender As Object, e As RoutedEventArgs)
    ' Open a file dialog to select a QR code image
    Dim dialog As New OpenFileDialog With {
        .Title = "Select a QR code image",
        .Filter = "Image Files|*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tiff"
    }

    If dialog.ShowDialog() <> True Then Return

    Dim imageSource As String = dialog.FileName

    ' Load the image into IronQR
    Dim inputBmp As AnyBitmap = AnyBitmap.FromFile(imageSource)

    ' Load the asset into QrImageInput
    Dim imageInput As New QrImageInput(inputBmp)

    ' Create a QR Reader object
    Dim reader As New QrReader()

    ' Read the input and get all embedded QR Codes
    Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

    ' Display the first result
    Dim firstResult As QrResult = results.FirstOrDefault()
    ResultLabel.Text = If(firstResult IsNot Nothing, "Scanned Text: " & firstResult.Value, "No QR code found in the selected image.")
End Sub
$vbLabelText   $csharpLabel

OpenFileDialog 提供原生 Windows 文件选择功能,并筛选出常见的图像格式。 AnyBitmap.FromFile 负责对 PNG、JPEG、BMP、GIF 和 TIFF 输入进行格式解码,而 QrReader.Read 则返回一个 IEnumerable<QrResult>,其中包含每个检测到的二维码对应的一条记录。 FirstOrDefault 在未找到二维码时会安全地返回 null,从而避免在图像中没有有效二维码时抛出异常。

输出

选择二维码图片并点击扫描按钮后,解码后的值将显示在按钮下方的 TextBlock 中。

WPF QR Code Scanner using IronQR — decoded result displayed in the window

在 WPF 窗口中渲染的解码 QR 码值

下载项目

点击此处下载完整的 WpfQrScanner 项目。

结论

IronQR 只需极少的配置即可集成到 WPF 应用程序中——仅需一次 QrReader.Read 调用即可处理桌面端的整个解码流程。若要从单张图片中扫描多个二维码,请遍历完整的结果集合,而非调用 FirstOrDefault

这种模式同样适用于批量处理(通过循环遍历图像文件目录)或实时扫描(使用 WPF 媒体控件从网络摄像头流中捕获帧)。

有关读取二维码及可用扫描模式的更多信息,请参阅《从图像读取二维码》和《使用扫描模式读取二维码》指南。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 63,625 | 版本: 2026.4 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronQR
运行示例 观看您的 URL 变成 QR 代码。