Visual Studio – WPF (Windows Presentation Foundation)

Das Windows Presentation Foundation-Framework ist ein modernes Programmiermodell für die Entwicklung von Windows- und Webbrowser Anwendungen. Es handelt sich sozusagen um eine Bibliothek von Klassen, für die Gestaltung von Oberflächen und die Integration von Multimedia, wie zum Beispiel Video, PDF, etc.

Vorteile WPF zu Windows Forms:

  • Erweitertes Data Binding
  • Verbesserte Layout Möglichkeiten
  • Flexibles Inhaltsmodell
  • Verbesserte Unterstützung für Audio/Video
  • Styles, Templates usw.

Zudem greift WPF zur Darstellung des Fensterinhalts auf DirectX zurück. Windows Forms greift auf die GDI-Komponente zurück. DirectX ist eine aus mehreren APIs bestehende Suite, die auf Windows Rechnern die Kommunikation zwischen Hardware und Software ermöglicht.

.NET Framework / ASP.NET

Frameworks (Rahmen) sind Programmiergerüste, die dem Entwickler das Programmieren erleichtern sollen. Sie bestehen häufig aus Klassenbibliotheken, Programmierschnittstellen, sonstiger Dienstprogramme und einer Laufzeitumgebung um den Code in die eigentliche Maschinensprache zu übersetzen. Das .NET Framework besteht aus der Common Language Runtime (CLR) und der .NET Framework-Klassenbibliothek. Diese Programmiergerüste finden auch in anderen Gebieten ihren Einsatz, wie zum Beispiel Web- oder Test-Frameworks.

ASP.NET ist ein Web Application Framework, mit dessen Hilfe Web basierte Applikationen geschrieben und den Nutzern bereitgestellt werden kann. Es handelt sich um ein Teil des .NET Frameworks und stellt wichtige Elemente wie die http-Laufzeitumgebung bereit, die http-Anfragen bearbeiten kann. Zudem stehen Klassen zur Verfügung um zum Beispiel Authentifizierung und Autorisierung von Benutzern zu ermöglichen.

Programmiersprache C#

C# (C sharp) ist eine typsichere, objektorientierte Programmiersprache für das .NET Framework von Microsoft, die speziell für diese Plattform entwickelt wurde. Eine typsichere Programmiersprache verwendet Datentypen gemäß der Definition der Sprache. Es tritt also keine Typverletzung auf.

Das Model View ViewModel (MVVM)

Das Model View ViewModel (MVVM) ist ein Entwurfsmuster und eine Variante des Model-View-Controller-Musters (MVC). Es dient zur Trennung von Darstellung und Logik der Benutzerschnittstelle (UI). Das MVVM nutzt die Trennung des MVC-Musters von Model und View. Es wird ein Datenbindungsmechanismus verwendet um die Komponenten zu koppeln. Das MVVM-Muster enthält folgende drei Komponenten: Model, View, ViewModel

Extensible Application Markup Language (XAML)

XAML ist ein in .NET 3.0 eingeführte XML-Beschreibungssprache, mit der Objektbäume erstellt werden können. Zur Laufzeit werden aus den in XAML deklarierten XML-Elementen .NET-Objekte erzeugt. Dadurch ist eine bessere Strukturierung der Anwendung und eine bessere Trennung zwischen der Benutzeroberfläche und der Programmlogik möglich.

Vergleich XAML und C#

XAML-Code

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="btnOk" FontStyle="Italic" Margin="10"> OK </Button>

C#-Code

System.Windows.Controls.Button btnOk = new System.Windows.Controls.Button();
btnOk.FontStyle = System.Windows.FontStyle.Italic;
btnOk.Margin = new System.Windows.Thickness(10);
btnOk.Content = “OK“;

Gleiches Ergebnis dieser beiden Code-Schnipsel, allerdings sollte der XAML-Code zur Beschreibung der Oberfläche dienen und der C#-Code die eigentliche Logik der Anwendung beinhalten.

WPF-Anwendung erstellen

Öffnen Sie Visual Studio und erstellen Sie ein neues Projekt.

Es erscheint ein Fenster, in welchem Sie WPF-App (.NET Framework) auswählen. Vergeben Sie Ihrem Projekt einen Namen und wählen den Speicherort.

Ihre Anwendung sollte nun folgendermaßen aussehen.

Toolbox und Steuerelemente

Öffnen Se die Toolbox am linken Fensterrand und ziehen die gewünschten Steuerelemente ins Fenster. Die Elemente können frei bewegt und skaliert werden.

Im Eigenschaften-Explorer auf der rechten Seite können weitere Änderungen vorgenommen werden.

In diesem Beispiel werden mehrere Buttons und ein Label benutzt. Im Eigenschaften-Explorer wurde Farbe, Größe und Text geändert. In der Datei MainWindow.xaml wird also lediglich die Darstellung der Anwendung angepasst.

Programmierlogik

Die eigentliche Programmierlogik befindet sich in der MainWindow.xaml.cs Datei


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace simple_calculator
{
    public partial class MainWindow : Window
    {
        private int x, y;

        enum Symbol { NULL, Add, Sub, Mul, Div}
        Symbol s = Symbol.NULL;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_one_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 1;
            label.Content = x;
        }

        private void button_two_Click(object sender, RoutedEventArgs e)
        {
            x = x * 10 + 2;
            label.Content = x;
        }

        private void button_three_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 3;
            label.Content = x;
        }

        private void button_four_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 4;
            label.Content = x;
        }

        private void button_five_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 5;
            label.Content = x;
        }

        private void button_six_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 6;
            label.Content = x;
        }

        private void button_seven_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 7;
            label.Content = x;
        }

        private void button_eight_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 8;
            label.Content = x;
        }

        private void button_nine_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 9;
            label.Content = x;
        }

        private void button_clear_Click(object sender, RoutedEventArgs e)
        {
            label.Content = "0";
            x = 0;
            y = 0;
        }

        private void button_add_Click(object sender, RoutedEventArgs e)
        {
            s = Symbol.Add;
            y = x;
            x = 0;
            label.Content = "+";
        }

        private void button_erg_Click(object sender, RoutedEventArgs e)
        {
            switch (s)
            {
                case Symbol.NULL:
                    break;
                case Symbol.Add:
                    x = y + x;
                    break;
                case Symbol.Sub:
                    x = y - x;
                    break;
                case Symbol.Mul:
                    x = y * x;
                    break;
                case Symbol.Div:
                    x = y / x;
                    break;
                default:
                    break;
            }
            label.Content = x.ToString();
            
        }

        private void button_sub_Click(object sender, RoutedEventArgs e)
        {
            s = Symbol.Sub;
            y = x;
            x = 0;
            label.Content = "-";
        }

        private void button_mul_Click(object sender, RoutedEventArgs e)
        {
            s = Symbol.Mul;
            y = x;
            x = 0;
            label.Content = "x";
        }

        private void button_div_Click(object sender, RoutedEventArgs e)
        {
            s = Symbol.Div;
            y = x;
            x = 0;
            label.Content = ":";
        }

        private void button_null_Click(object sender, RoutedEventArgs e)
        {
            x = 10 * x + 0;
            label.Content = x;
        }

    }
}