Comment créer une application de bureau de lecture de codes-barres (scanner/générateur) avec .NET MAUI

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

Pour une solution logicielle complète, l'accessibilité mobile ne suffit pas. La possibilité de déployer nativement sur des systèmes d'exploitation de bureau, tels que Windows et macOS, est tout aussi essentielle. Cette approche multiplateforme permet aux entreprises de tirer pleinement parti de la puissance des postes de travail pour les tâches à volume élevé telles que le suivi et l'administration des actifs.

Sans une prise en charge adéquate des postes de travail, les flux de travail sont interrompus ou, pire encore, forcés de s'exécuter sur des appareils moins performants. Ceci est particulièrement important dans la gestion des stocks, où le personnel de bureau doit générer rapidement des lots de codes ou vérifier des scans sans quitter son bureau.

IronBarcode fournit les outils nécessaires à la mise en œuvre de ces fonctionnalités, garantissant ainsi le bon fonctionnement de votre application .NET MAUI sur n'importe quel ordinateur.

Dans cet article, nous expliquerons comment intégrer IronBarcode pour créer à la fois un scanner de codes-barres de bureau et un générateur de codes-barres de bureau .

Commencez avec IronBarcode



Application de bureau .NET MAUI

L'intégration d'IronBarcode dans une application .NET MAUI est simple, car la bibliothèque fonctionne nativement avec la plateforme de bureau dès son installation. Dans cet exemple, nous allons créer séparément un lecteur de codes-barres et un générateur de codes-barres à l'aide d'IronBarcode.

Commençons par le lecteur de codes-barres.

Interface de lecteur de codes-barres XAML

Pour l'interface .NET MAUI, une interface simple est implémentée pour permettre aux utilisateurs de télécharger des images de codes-barres via un bouton de soumission. Le fichier MainPage.xaml du projet doit être remplacé par le contenu indiqué ci-dessous.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="25" Padding="30" VerticalOptions="Center">

            <Label Text="Desktop Barcode Scanner"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Image x:Name="ScannerImage"
                   HeightRequest="300"
                   WidthRequest="400"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit"
                   HorizontalOptions="Center" />

            <Button Text="Select Image to Scan"
                    Clicked="OnScanButtonClicked"
                    HorizontalOptions="Center" 
                    WidthRequest="200"/>

            <Label x:Name="ResultLabel"
                   Text="Result will appear here..."
                   FontSize="20"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="25" Padding="30" VerticalOptions="Center">

            <Label Text="Desktop Barcode Scanner"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Image x:Name="ScannerImage"
                   HeightRequest="300"
                   WidthRequest="400"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit"
                   HorizontalOptions="Center" />

            <Button Text="Select Image to Scan"
                    Clicked="OnScanButtonClicked"
                    HorizontalOptions="Center" 
                    WidthRequest="200"/>

            <Label x:Name="ResultLabel"
                   Text="Result will appear here..."
                   FontSize="20"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
XML

Scanner de codes-barres de bureau Logic CS

Ensuite, la logique qui s'applique lorsque l'utilisateur clique sur le bouton est implémentée. Un gestionnaire d'événements OnScanButtonClicked est associé au bouton de numérisation dans l'interface utilisateur.

PickPhotoAsync est d'abord utilisé pour permettre aux utilisateurs de choisir le code-barres à télécharger, suivi de OpenReadAsync pour accéder au flux de fichiers. Les données de l'image sont immédiatement copiées dans un MemoryStream à l'aide de CopyToAsync . Cela permet d'utiliser simultanément les données pour afficher l'image à l'écran et pour que la méthode Read puisse scanner le code-barres.

Enfin, la valeur du code-barres est affichée dans l'interface utilisateur si un code-barres valide est détecté, ou un message rouge s'affiche indiquant qu'aucun code-barres n'a été trouvé dans l'image.

Remplacez la clé de licence par la vôtre avant de tester l'application.

using IronBarCode;

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            // Your license key is set here
            IronBarCode.License.LicenseKey = "YOUR_KEY"
        }

        private async void OnScanButtonClicked(object sender, EventArgs e)
        {
            try
            {
                var fileResult = await MediaPicker.Default.PickPhotoAsync();

                if (fileResult != null)
                {
                    // 1. Copy the file content into a byte array or MemoryStream immediately
                    // This ensures we have the data in memory before the file closes
                    byte[] imageBytes;
                    using (var stream = await fileResult.OpenReadAsync())
                    using (var memoryStream = new MemoryStream())
                    {
                        await stream.CopyToAsync(memoryStream);
                        imageBytes = memoryStream.ToArray();
                    }

                    // 2. Set the Image Source for the UI
                    // We give the UI a FRESH stream from the bytes we just saved
                    ScannerImage.Source = ImageSource.FromStream(() => new MemoryStream(imageBytes));

                    // 3. Process the Barcode
                    // We give IronBarcode its OWN fresh stream from the same bytes
                    using (var processingStream = new MemoryStream(imageBytes))
                    {
                        // 4. Read the barcode with Read
                        var results = BarcodeReader.Read(processingStream);

                        // 5. Display barcode results
                        if (results != null && results.Count > 0)
                        {

                            // Successfully found barcode value
                            ResultLabel.Text = $"Success: {results[0].Value}";
                            ResultLabel.TextColor = Colors.Green;
                        }
                        else
                        {
                            // Image uploaded has no barcode or barcode value is not found
                            ResultLabel.Text = "No barcode detected.";
                            ResultLabel.TextColor = Colors.Red;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Display any exception thrown in runtime
                ResultLabel.Text = $"Error: {ex.Message}";
                ResultLabel.TextColor = Colors.Red;
            }
        }
    }
}
using IronBarCode;

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            // Your license key is set here
            IronBarCode.License.LicenseKey = "YOUR_KEY"
        }

        private async void OnScanButtonClicked(object sender, EventArgs e)
        {
            try
            {
                var fileResult = await MediaPicker.Default.PickPhotoAsync();

                if (fileResult != null)
                {
                    // 1. Copy the file content into a byte array or MemoryStream immediately
                    // This ensures we have the data in memory before the file closes
                    byte[] imageBytes;
                    using (var stream = await fileResult.OpenReadAsync())
                    using (var memoryStream = new MemoryStream())
                    {
                        await stream.CopyToAsync(memoryStream);
                        imageBytes = memoryStream.ToArray();
                    }

                    // 2. Set the Image Source for the UI
                    // We give the UI a FRESH stream from the bytes we just saved
                    ScannerImage.Source = ImageSource.FromStream(() => new MemoryStream(imageBytes));

                    // 3. Process the Barcode
                    // We give IronBarcode its OWN fresh stream from the same bytes
                    using (var processingStream = new MemoryStream(imageBytes))
                    {
                        // 4. Read the barcode with Read
                        var results = BarcodeReader.Read(processingStream);

                        // 5. Display barcode results
                        if (results != null && results.Count > 0)
                        {

                            // Successfully found barcode value
                            ResultLabel.Text = $"Success: {results[0].Value}";
                            ResultLabel.TextColor = Colors.Green;
                        }
                        else
                        {
                            // Image uploaded has no barcode or barcode value is not found
                            ResultLabel.Text = "No barcode detected.";
                            ResultLabel.TextColor = Colors.Red;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Display any exception thrown in runtime
                ResultLabel.Text = $"Error: {ex.Message}";
                ResultLabel.TextColor = Colors.Red;
            }
        }
    }
}
$vbLabelText   $csharpLabel

Sortie avec valeur de code-barres trouvée

Codes-barres trouvés

Comme vous pouvez le constater, l'application affiche le résultat du code-barres et l'image du code-barres téléchargée.

Sortie sans valeur de code-barres trouvée

Aucun code-barres trouvé

Comme vous pouvez le constater, lorsqu'un utilisateur télécharge une image ne contenant pas de code-barres, un message rouge s'affiche indiquant " Aucun code-barres trouvé ".

Générateur de codes-barres de bureau

La partie suivante s'appuie sur le même concept en intégrant IronBarcode à MAUI pour créer un générateur de codes-barres.

Interface du générateur de codes-barres XAML

L'interface du générateur utilise un formulaire simple permettant la saisie de texte et la sélection du type de code-barres via un menu déroulant. Un bouton permet de déclencher le processus de génération et d'enregistrement, ainsi qu'une fenêtre d'affichage pour visualiser le résultat. Le fichier MainPage.xaml doit être remplacé par le contenu indiqué ci-dessous.

Veuillez consulter ici la liste complète des codes-barres 1D et ici celle des codes-barres 2D.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30" VerticalOptions="Center">

            <Label Text="Barcode Generator"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Entry x:Name="BarcodeEntry"
                   Placeholder="Enter value (e.g. 12345 or https://ironsoftware.com)"
                   WidthRequest="300" />

            <Picker x:Name="BarcodeTypePicker"
                    Title="Select Barcode Type"
                    WidthRequest="300">
                <Picker.ItemsSource>
                    <x:Array Type="{x:Type x:String}">
                        <x:String>QRCode</x:String>
                        <x:String>Code128</x:String>
                        <x:String>EAN13</x:String>
                        <x:String>Code39</x:String>
                        <x:String>PDF417</x:String>
                    </x:Array>
                </Picker.ItemsSource>
            </Picker>

            <Button Text="Generate &amp; Save"
                    Clicked="OnGenerateButtonClicked"
                    HorizontalOptions="Center"
                    WidthRequest="200" />

            <Image x:Name="GeneratedImage"
                   HeightRequest="200"
                   WidthRequest="300"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit" />

            <Label x:Name="StatusLabel"
                   FontSize="16"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30" VerticalOptions="Center">

            <Label Text="Barcode Generator"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Entry x:Name="BarcodeEntry"
                   Placeholder="Enter value (e.g. 12345 or https://ironsoftware.com)"
                   WidthRequest="300" />

            <Picker x:Name="BarcodeTypePicker"
                    Title="Select Barcode Type"
                    WidthRequest="300">
                <Picker.ItemsSource>
                    <x:Array Type="{x:Type x:String}">
                        <x:String>QRCode</x:String>
                        <x:String>Code128</x:String>
                        <x:String>EAN13</x:String>
                        <x:String>Code39</x:String>
                        <x:String>PDF417</x:String>
                    </x:Array>
                </Picker.ItemsSource>
            </Picker>

            <Button Text="Generate &amp; Save"
                    Clicked="OnGenerateButtonClicked"
                    HorizontalOptions="Center"
                    WidthRequest="200" />

            <Image x:Name="GeneratedImage"
                   HeightRequest="200"
                   WidthRequest="300"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit" />

            <Label x:Name="StatusLabel"
                   FontSize="16"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
XML

Générateur de codes-barres de bureau Logic CS

Ensuite, la logique de l'événement de clic sur le bouton est implémentée. Un gestionnaire d'événements OnGenerateButtonClicked est associé au bouton de génération dans l'interface utilisateur.

Les données saisies par l'utilisateur sont validées pour s'assurer que du texte est présent et qu'un type est sélectionné, après quoi la sélection est associée à l' BarcodeEncoding correct. BarcodeWriter.CreateBarcode est utilisée pour générer l'image, la redimensionner et la convertir en données binaires JPEG. L'image est ensuite affichée à l'écran à l'aide d'un MemoryStream .

Enfin, le fichier de code-barres généré est enregistré directement sur le bureau de l'utilisateur à l'aide File.WriteAllBytes , et l'étiquette d'état est mise à jour pour confirmer l'emplacement d'enregistrement.

Remplacez la clé de licence par la vôtre avant de tester l'application.

using IronBarCode;
using System.IO; // Required for saving files

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IronBarCode.License.LicenseKey = "YOUR-KEY";

            // Set default selection
            BarcodeTypePicker.SelectedIndex = 0;
        }

        private void OnGenerateButtonClicked(object sender, EventArgs e)
        {
            try
            {
                // 1. Get and Validate Input
                string text = BarcodeEntry.Text;

                if (string.IsNullOrWhiteSpace(text))
                {
                    StatusLabel.Text = "Error: Please enter text.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                if (BarcodeTypePicker.SelectedIndex == -1)
                {
                    StatusLabel.Text = "Error: Please select a type.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                // 2. Determine Encoding Type
                string selectedType = BarcodeTypePicker.SelectedItem.ToString();
                BarcodeEncoding encoding = BarcodeEncoding.QRCode;

                switch (selectedType)
                {
                    case "QRCode": encoding = BarcodeEncoding.QRCode; break;
                    case "Code128": encoding = BarcodeEncoding.Code128; break;
                    case "EAN13": encoding = BarcodeEncoding.EAN13; break;
                    case "Code39": encoding = BarcodeEncoding.Code39; break;
                    case "PDF417": encoding = BarcodeEncoding.PDF417; break;
                }

                // 3. Generate Barcode
                var barcode = BarcodeWriter.CreateBarcode(text, encoding);
                barcode.ResizeTo(400, 200); // Optional resizing

                // 4. Convert to Bytes (JPEG)
                var bytes = barcode.ToJpegBinaryData();

                // 5. Update UI
                GeneratedImage.Source = ImageSource.FromStream(() => new MemoryStream(bytes));

                // 6. Save to Desktop automatically
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string fileName = $"barcode_{DateTime.Now:yyyyMMdd_HHmmss}.jpg";
                string fullPath = Path.Combine(desktopPath, fileName);

                File.WriteAllBytes(fullPath, bytes);

                // 7. Show Success Message
                StatusLabel.Text = $"Saved to Desktop:\n{fileName}";
                StatusLabel.TextColor = Colors.Green;
            }
            catch (Exception ex)
            {
                StatusLabel.Text = $"Error: {ex.Message}";
                StatusLabel.TextColor = Colors.Red;
            }
        }
    }
}
using IronBarCode;
using System.IO; // Required for saving files

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IronBarCode.License.LicenseKey = "YOUR-KEY";

            // Set default selection
            BarcodeTypePicker.SelectedIndex = 0;
        }

        private void OnGenerateButtonClicked(object sender, EventArgs e)
        {
            try
            {
                // 1. Get and Validate Input
                string text = BarcodeEntry.Text;

                if (string.IsNullOrWhiteSpace(text))
                {
                    StatusLabel.Text = "Error: Please enter text.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                if (BarcodeTypePicker.SelectedIndex == -1)
                {
                    StatusLabel.Text = "Error: Please select a type.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                // 2. Determine Encoding Type
                string selectedType = BarcodeTypePicker.SelectedItem.ToString();
                BarcodeEncoding encoding = BarcodeEncoding.QRCode;

                switch (selectedType)
                {
                    case "QRCode": encoding = BarcodeEncoding.QRCode; break;
                    case "Code128": encoding = BarcodeEncoding.Code128; break;
                    case "EAN13": encoding = BarcodeEncoding.EAN13; break;
                    case "Code39": encoding = BarcodeEncoding.Code39; break;
                    case "PDF417": encoding = BarcodeEncoding.PDF417; break;
                }

                // 3. Generate Barcode
                var barcode = BarcodeWriter.CreateBarcode(text, encoding);
                barcode.ResizeTo(400, 200); // Optional resizing

                // 4. Convert to Bytes (JPEG)
                var bytes = barcode.ToJpegBinaryData();

                // 5. Update UI
                GeneratedImage.Source = ImageSource.FromStream(() => new MemoryStream(bytes));

                // 6. Save to Desktop automatically
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string fileName = $"barcode_{DateTime.Now:yyyyMMdd_HHmmss}.jpg";
                string fullPath = Path.Combine(desktopPath, fileName);

                File.WriteAllBytes(fullPath, bytes);

                // 7. Show Success Message
                StatusLabel.Text = $"Saved to Desktop:\n{fileName}";
                StatusLabel.TextColor = Colors.Green;
            }
            catch (Exception ex)
            {
                StatusLabel.Text = $"Error: {ex.Message}";
                StatusLabel.TextColor = Colors.Red;
            }
        }
    }
}
$vbLabelText   $csharpLabel

Sortie avec code-barres généré

Générer un code-barres réussi

Comme vous pouvez le constater, l'application affiche le code-barres généré et l'enregistre sur le bureau de l'utilisateur.

Échec de sortie

Échec de la génération du code-barres

Certains types de codes-barres présentent des restrictions et des exigences de format pour la valeur saisie. Lorsque la génération du code-barres échoue, l'application affiche l'exception IronBarcode, comme indiqué ci-dessus. Veuillez vous référer aux formats détaillés 1D et 2D respectifs pour chaque type de code-barres.

Pour tester les exemples ci-dessus ( lecteur de codes-barres de bureau et générateur de codes-barres de bureau ), veuillez télécharger cet exemple de projet.

Questions Fréquemment Posées

Qu'est-ce que .NET MAUI ?

.NET MAUI est un framework multiplateforme permettant de créer des applications natives pour mobiles et ordinateurs avec C# et XAML. Il permet aux développeurs de créer des applications pour Android, iOS, macOS et Windows à partir d'une seule base de code.

Comment utiliser IronBarcode dans une application .NET MAUI ?

IronBarcode peut être intégré à une application .NET MAUI pour permettre la génération et la lecture de codes-barres. Il offre une solution simple pour créer et lire des codes-barres sur différentes plateformes de bureau.

Quels types de codes-barres IronBarcode peut-il générer ?

IronBarcode prend en charge la génération d'une grande variété de formats de codes-barres, notamment les codes QR, Code 128, Code 39, UPC, EAN et bien d'autres, ce qui le rend polyvalent pour répondre à tous les besoins des applications de bureau.

Est-il possible de scanner des codes-barres à l'aide d'une application de bureau développée avec IronBarcode ?

Oui, IronBarcode peut être utilisé pour scanner les codes-barres dans les applications de bureau, permettant aux utilisateurs de décoder rapidement et efficacement les informations des codes-barres via l'interface de l'application.

Quels sont les avantages de l'utilisation d'IronBarcode pour les applications de codes-barres ?

IronBarcode offre une grande précision, une rapidité d'exécution et une facilité d'utilisation optimale. Il s'intègre parfaitement à .NET MAUI, assurant une prise en charge complète de la génération et de la lecture de codes-barres dans les applications de bureau.

IronBarcode peut-il gérer de grands volumes de données de codes-barres ?

Oui, IronBarcode est conçu pour traiter efficacement de grands volumes de données de codes-barres, ce qui le rend adapté aux applications nécessitant la gestion de tâches complexes liées aux codes-barres.

Ai-je besoin d'une bibliothèque distincte pour la lecture et la génération des codes-barres ?

Non, IronBarcode fournit à la fois des fonctionnalités de lecture et de génération de codes-barres au sein d'une seule bibliothèque, simplifiant ainsi le processus de développement des applications de bureau.

Quelles sont les exigences système pour utiliser IronBarcode avec .NET MAUI ?

IronBarcode nécessite un environnement .NET compatible avec .NET MAUI. Il prend en charge Windows, macOS et d'autres plateformes sur lesquelles les applications .NET MAUI peuvent s'exécuter.

Comment IronBarcode garantit-il la précision des codes-barres ?

IronBarcode utilise des algorithmes avancés pour garantir une haute précision dans la génération et la lecture des codes-barres, réduisant ainsi la probabilité d'erreurs d'encodage ou de décodage des données.

IronBarcode peut-il être utilisé pour des projets à la fois commerciaux et personnels ?

Oui, IronBarcode peut être utilisé pour des projets commerciaux et personnels, offrant des options de licence flexibles pour s'adapter aux différents besoins des projets.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 2,035,202 | Version : 2025.12 vient de sortir