Wie man eine Desktop-Barcode-Anwendung (Scanner/Generator) mit .NET MAUI erstellt

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

Für eine umfassende Softwarelösung geht es nicht nur um mobile Zugänglichkeit. Die Möglichkeit zur nativen Bereitstellung auf Desktop-Betriebssystemen wie Windows und macOS ist ebenso wichtig. Dieser plattformübergreifende Ansatz ermöglicht es Unternehmen, die volle Leistungsfähigkeit von Workstations für umfangreiche Aufgaben wie Anlagenverfolgung und -verwaltung zu nutzen.

Ohne angemessene Desktop-Unterstützung werden Arbeitsabläufe unterbrochen oder, schlimmer noch, auf weniger leistungsfähige Geräte gezwungen. Dies ist insbesondere im Bereich der Bestandsverwaltung wichtig, wo Büroangestellte schnell große Mengen an Codes generieren oder Scans überprüfen müssen, ohne ihren Arbeitsplatz verlassen zu müssen.

IronBarcode liefert die notwendigen Werkzeuge zur Implementierung dieser Funktionen und gewährleistet so, dass Ihre .NET MAUI-Anwendung auf jedem Computer zuverlässig funktioniert.

In diesem Artikel erklären wir, wie man IronBarcode integriert, um sowohl einen Desktop-Barcode-Scanner als auch einen Desktop-Barcode-Generator zu erstellen.

Erste Schritte mit IronBarcode



.NET MAUI Desktop-Anwendung

Die Integration von IronBarcode in eine .NET MAUI-Anwendung ist unkompliziert, da die Bibliothek nativ mit der Desktop-Plattform sofort einsatzbereit ist. In diesem Beispiel erstellen wir mit IronBarcode sowohl einen Barcode-Scanner als auch einen Barcode-Generator separat.

Beginnen wir mit dem Barcode-Scanner.

Barcode-Scanner-Schnittstelle XAML

Für die .NET MAUI-Schnittstelle wurde eine einfache Schnittstelle implementiert, die es Benutzern ermöglicht, Barcode-Bilder über eine Schaltfläche zum Absenden hochzuladen. Die Datei MainPage.xaml innerhalb des Projekts sollte durch den unten gezeigten Inhalt ersetzt werden.

<?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

Desktop-Barcode-Scanner-Logik CS

Als Nächstes wird die Logik für den Fall implementiert, dass der Benutzer auf die Schaltfläche klickt. Dem Scan-Button in der Benutzeroberfläche ist ein Ereignishandler namens OnScanButtonClicked zugeordnet.

PickPhotoAsync wird zuerst verwendet, um dem Benutzer die Auswahl des hochzuladenden Barcodes zu ermöglichen, gefolgt von OpenReadAsync um auf den Dateistream zuzugreifen. Die Bilddaten werden mithilfe von CopyToAsync sofort in einen MemoryStream kopiert. Dadurch können die Daten gleichzeitig zur Anzeige des Bildes auf dem Bildschirm und zum Scannen des Barcodes durch die Read verwendet werden.

Schließlich wird der Barcode-Wert in der Benutzeroberfläche angezeigt, wenn ein gültiger Barcode erkannt wurde, andernfalls wird eine rote Meldung angezeigt, die besagt, dass im Bild kein Barcode gefunden wurde.

Hinweis: Ersetzen Sie den Lizenzschlüssel durch Ihren eigenen, bevor Sie die Anwendung testen.

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

Ausgabe mit gefundenem Barcode-Wert

Ausgabe der gefundenen Barcodes

Wie Sie sehen können, zeigt die Anwendung das Barcode-Ergebnis und das hochgeladene Barcode-Bild an.

Ausgabe ohne gefundenen Barcode-Wert

Ausgabe

Wie Sie sehen können, wird beim Hochladen eines Bildes ohne Barcode eine rote Meldung mit dem Hinweis "Keine Barcodes gefunden" angezeigt.

Desktop-Barcode-Generator

Im nächsten Teil wird dasselbe Konzept weitergeführt, indem IronBarcode in MAUI integriert wird, um einen Barcode-Generator zu erstellen.

Barcode-Generator-Schnittstelle (XAML)

Für die Benutzeroberfläche des Generators wurde ein einfaches Formular implementiert, das die Texteingabe und die Auswahl des Barcode-Typs über ein Dropdown-Menü ermöglicht. Ein Button zum Auslösen des Generierungs- und Speichervorgangs sowie eine Bildansicht zur Anzeige des Ergebnisses sind enthalten. Die Datei MainPage.xaml sollte durch den unten gezeigten Inhalt ersetzt werden.

Die vollständige Liste der 1D-Barcodes finden Sie hier und die der 2D-Barcodes hier .

<?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

Desktop-Barcode-Generator-Logik CS

Als Nächstes wird die Logik für das Klickereignis der Schaltfläche implementiert. Dem Generieren-Button in der Benutzeroberfläche ist ein OnGenerateButtonClicked Ereignishandler zugeordnet.

Die Benutzereingaben werden validiert, um sicherzustellen, dass Text vorhanden ist und ein Typ ausgewählt wurde. Anschließend wird die Auswahl der korrekten BarcodeEncoding zugeordnet. BarcodeWriter.CreateBarcode wird das Bild generiert, seine Größe angepasst und es in binäre JPEG-Daten konvertiert. Das Bild wird dann mithilfe eines MemoryStream auf dem Bildschirm angezeigt.

Schließlich wird die generierte Barcode-Datei mit File.WriteAllBytes direkt auf dem Desktop des Benutzers gespeichert, und die Statusbezeichnung wird aktualisiert, um den Speicherort zu bestätigen.

Hinweis: Ersetzen Sie den Lizenzschlüssel durch Ihren eigenen, bevor Sie die Anwendung testen.

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

Ausgabe mit generiertem Barcode

Barcode erfolgreich generiert

Wie Sie sehen können, zeigt die Anwendung den generierten Barcode an und speichert ihn auf dem Desktop des Benutzers.

Ausgabefehler

Fehler beim Generieren des Barcodes

Bestimmte Barcode-Typen unterliegen Einschränkungen und Formatvorgaben für den Eingabewert. Wenn die Generierung des Barcodes fehlschlägt, zeigt die Anwendung die IronBarcode-Ausnahme an, wie oben dargestellt. Die Formatierung der einzelnen Barcode-Typen entnehmen Sie bitte den jeweiligen detaillierten 1D- und 2D- Dokumentationen.

Um die oben genannten Beispiele ( Desktop-Barcode-Scanner und Desktop-Barcode-Generator ) zu testen, laden Sie bitte dieses Beispielprojekt herunter .

Häufig gestellte Fragen

Was ist .NET MAUI?

.NET MAUI ist ein plattformübergreifendes Framework zur Erstellung nativer mobiler und Desktop-Apps mit C# und XAML. Es ermöglicht Entwicklern, Anwendungen für Android, iOS, macOS und Windows mit einer einzigen Codebasis zu erstellen.

Wie kann IronBarcode in einer .NET MAUI-Anwendung verwendet werden?

IronBarcode lässt sich in eine .NET MAUI-Anwendung integrieren und ermöglicht so die Generierung und das Scannen von Barcodes. Es bietet eine unkomplizierte Möglichkeit, Barcodes auf verschiedenen Desktop-Plattformen zu erstellen und zu lesen.

Welche Barcodetypen kann IronBarcode generieren?

IronBarcode unterstützt die Generierung einer Vielzahl von Barcode-Formaten, darunter QR-Codes, Code 128, Code 39, UPC, EAN und viele mehr, wodurch es vielseitig für alle Anforderungen von Desktop-Anwendungen geeignet ist.

Ist es möglich, Barcodes mit einer Desktop-Anwendung zu scannen, die mit IronBarcode erstellt wurde?

Ja, IronBarcode kann zum Scannen von Barcodes in Desktop-Anwendungen verwendet werden, sodass Benutzer Barcode-Informationen schnell und effizient über die Benutzeroberfläche der Anwendung dekodieren können.

Welche Vorteile bietet die Verwendung von IronBarcode für Barcode-Anwendungen?

IronBarcode zeichnet sich durch hohe Genauigkeit, Geschwindigkeit und Benutzerfreundlichkeit aus. Es integriert sich nahtlos in .NET MAUI und bietet umfassende Unterstützung für die Barcode-Generierung und das Scannen in Desktop-Anwendungen.

Kann IronBarcode große Mengen an Barcode-Daten verarbeiten?

Ja, IronBarcode ist so konzipiert, dass es große Mengen an Barcode-Daten effizient verarbeiten kann und sich daher für Anwendungen eignet, die umfangreiche Barcode-Aufgaben erfordern.

Benötige ich eine separate Bibliothek zum Scannen und Generieren von Barcodes?

Nein, IronBarcode bietet sowohl Barcode-Scan- als auch Barcode-Generierungsfunktionen in einer einzigen Bibliothek und vereinfacht so den Entwicklungsprozess für Desktop-Anwendungen.

Welche Systemvoraussetzungen gelten für die Verwendung von IronBarcode mit .NET MAUI?

IronBarcode benötigt eine .NET-Umgebung, die mit .NET MAUI kompatibel ist. Es unterstützt Windows, macOS und andere Plattformen, auf denen .NET MAUI-Anwendungen ausgeführt werden können.

Wie stellt IronBarcode die Genauigkeit der Barcodes sicher?

IronBarcode verwendet fortschrittliche Algorithmen, um eine hohe Präzision sowohl bei der Barcode-Erstellung als auch beim Scannen zu gewährleisten und so die Wahrscheinlichkeit von Fehlern bei der Kodierung oder Dekodierung von Barcode-Daten zu verringern.

Kann IronBarcode sowohl für kommerzielle als auch für private Projekte verwendet werden?

Ja, IronBarcode kann sowohl für kommerzielle als auch für private Projekte verwendet werden und bietet flexible Lizenzierungsoptionen, die den unterschiedlichen Projektanforderungen gerecht werden.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 2,035,202 | Version: 2025.12 gerade veröffentlicht