Zum Inhalt springen
  • 0

Aufgabe (C# Konsolen-"Spiel" in WPF umsetzen)


Frage

Geschrieben

Hallo!

Als Frischling habe ich eine Konsolenapp geschrieben. Grober Inhalt/Ablauf:

Starttext in Konsole: "Hallo, wie ist dein Name?"
App wartet auf Eingabe + Bestätigung, folgend:
Rückgabe der Konsole "Wunderbar, willst du ein Abenteuer mit mir erleben?"
App wartet auf Eingabe + Bestätigung, folgend:

Rückgabe der Konsole "Ist es draußen warm oder kalt?"

App wartet auf Eingabe + Bestätigung usw usw usw

Nun habe ich mein erstes Willkommensfenster in WPF erstellt. Aber wie setze ich nun das Clickevent so um, dass sich einfach nur der Text im Fenster ändert, sodass sich quasi eine Art "Konversation" ergibt? Vielleicht sehe ich den Wald vor lauter Bäumen nicht, bitte um möglichst anfängerfreundliche / sinnvollste Varianten mein Vorhaben umzusetzen... Die Eingabe der Nutzerantworten erfolgt zumeist via ButtonClicks.

Beste Grüße,

Fin

10 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben (bearbeitet)

Wir brauchen echt die Info, wie du es machen willst. Es gibt mehrere Wege etwas in WPF zu machen. Wenn du MVVM lernen willst, bräuchtest du ne Klasse (ViewModel) die mit den ganzen Daten arbeitet. Dann hättest du in deiner UI nur noch Verweise (Bindings) auf die Daten und Befehle.

In MVVM würde es (kurz unsauber hingeklatscht, weil ich selbst auch noch arbeiten muss ;) ) etwa so aussehen:

public class Klasse : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public string Eingabe { get; set; }
        public string Ausgabe { get; set; }
        public ICommand Tuwas  => new RelayCommand(o => true, o => aufgehts());

        private void aufgehts()
        {
            Ausgabe = "Test";
            OnPropertyChanged(nameof(Ausgabe));
        }
    }
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock Text="{Binding Ausgabe, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Top"></TextBlock>
        <TextBox Text="{Binding Eingabe}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="68" Margin="96,55,0,0"></TextBox>
        <Button Command="{Binding Tuwas}" Content="Klick Mich" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="96,78,0,0"></Button>
    </Grid>
</Window>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new Klasse();
        }
    }
 public class RelayCommand : ICommand
    {
        private Predicate<object> _canExecute;
        private Action<object> _execute;

        public RelayCommand(Predicate<object> canExecute, Action<object> execute)
        {
            this._canExecute = canExecute;
            this._execute = execute;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    }

Wobei hier nicht alles schön ist. Ich setze den DataContext ungerne ins Codebehind. Wie gesagt wir müssen wissen welche Technologie bzw. wie du deine Lösung anstrebst. Wenn du Event basiert arbeiten willst, dann kannst du eigentlich gleich bei WinForms bleiben, dass ist nämlich so ziemlich der WinForms Style.

Ein anderer Weg ist auch, CommandBindings in der UI zu definieren, die auf ein Event im CodeBehind zeigen. Gibt viele Wege...manche werden als sehr unsauber angesehen. 

Edit: Der Code oben gibt nur was aus und soll dir ne Idee geben wie sowas aussehen kann. 

RelayCommand dient vereinfacht gesagt zum Ausführen von Aktionen. OnPropertyChanged dient vereinfacht gesagt um zu "melden" dass man ein Property geändert hat (du siehst das in der UI ein UpdateSourceTrigger ist der auf PropertyChanged eingestellt ist).

Ich würde es jetzt gerne ausführlicher erklären, aber wie gesagt: Ich muss arbeiten :D

 

Bearbeitet von KeeperOfCoffee
  • 1
Geschrieben
vor 6 Stunden schrieb KeeperOfCoffee:

Mich würden auch mal @Errraddicator und @Whiz-zarD Meinung hier interessieren, ihr postet doch öfters in C# Themen. 

Ganz ehrlich? Ich würde das Thema WPF und besonders MVVM weglassen, denn ich denke, dass es wenig Sinn macht, damit zu arbeiten, wie es gedacht war, da die Grundlagen der (objektorientierten) Programmierung eindeutig fehlen. Ich brauche mir da nur den Code der Konsolenanwendung sehen und sehe da sehr viele Probleme. Z.B. das eher nach struktureller Programmierung vorgegangen wurde, anstatt objektorientiert. Im MVVM zu erklären, müsste man wohl damit anfangen, was überhaupt Klassen sind.

Wenn es nicht unbedingt eine grafische Oberfläche sein soll, würde ich sie auch lassen, da eben gewisse Kenntnisse Voraussetzungen sind, um überhaupt zu verstehen, was man da eigentlich macht.

Wenn es aber eine grafische Oberfläche haben soll, würde ich mal die Benutzersteuerelementen in den raum werfen.

 

  • 0
Geschrieben

Ich bin zwar nicht der Programmierexperte aber ich würde nach dem Click Event eine zeitliche Verzögerung einbauen und erst dann den Text dann anzeigen lassen... Dieses typische "Lesen und verstehen, anschließend Zeit geben, um zu Antworten", wie bei WhatsApp. Eventuell kannst du dem Label nach einer gewissen zeitlichen Verzögerung von 3 Sek(?) den Text anzeigen lassen, den die Konsole herausgeben soll.

  • 0
Geschrieben

Wie ist die UI denn aufgebaut? Ich nehme mal ein eine Textbox für die Eingabe, ein "OK"-Button um die Eingabe zu bestätigen, und ein Lanel/Textblock in den du den Output des Programmes reinschreibst

  • 0
Geschrieben

Den DataContext Kannst du im xaml auch wie folgt setzen:

<Window ..... >
  <Window.DataContext>
    <local:Klasse />
  </Window.DataContext>  
  <Grid>...</Grid>
</Window>

So sparst du dir die Zeile im Codebehind.

Ich bin auch ein Freund die Commands im ViewModel zu definieren. Da hat man am Ende alles schön gebündelt.
Dazu noch Bezeichnungen direkt in Resourcendateien definieren, damit man später weniger Arbeit bei der lokalisierung hat. Bei einem kleinen Testprojekt mag das nicht viel nützen, aber später spart dieser Ansatz meiner Meinung nach viel Zeit.

  • 0
Geschrieben
vor 49 Minuten schrieb Mttkrb:

So sparst du dir die Zeile im Codebehind.

Ja kann ich für meine Fälle nie nutzen, dafür habe ich diese schöne Sache :wub:

        public void CreateNewWindow<T>(double height, double width, string title, Type t, object vm) where T : new()
        {
            var svm = Convert.ChangeType(vm, t);
            var fenster = new T() as Window;
            fenster.DataContext = svm;
            fenster.Height = height;
            fenster.Width = width;
            fenster.Title = title;
            fenster.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            fenster.ShowDialog();
        }

geht nur nicht wenn ich ne View mit Parameter initialisiere, passiert aber selten

  • 0
Geschrieben

Erstmal fetten Dank an alle Antwortenden! Hab gar nicht mit so viel Help/Feedback gerechnet! Top!
Gestern bin ich nach fürchterlich langer Zeit erst auf den richtigen "Google"-Pfad der "Erlösung" gekommen. Denn mir war einfach nicht klar, wie ich mit nem ClickEvent ein 2. Fenster provozieren kann (ne MessageBox bringt mir ja nix). 

Ich hab bisher ein bissl was zusammengeschustert, ich zeigs euch einfach mal (soll auf jeden Fall ein WPF-Projekt bleiben!)
 

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 Stay_Alive
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void WelcomeWindow_B1_Ja_Click(object sender, RoutedEventArgs e)
        {
            name name = new name();
            name.Show();
            this.Close();
        }

        private void WelcomeWindow_B2_Nein_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}
<Application x:Class="Stay_Alive.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Stay_Alive"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        
        <LinearGradientBrush x:Key="gradientBackground" EndPoint="1,0.5" StartPoint="0,0.5">
            <GradientStop Color="Black" Offset="0"/>
            <GradientStop Color="#FF006A00" Offset="1"/>
        </LinearGradientBrush>

        <Style TargetType="Button">
            <Setter Property="Height" Value="25"/>
            <Setter Property="Width" Value="100"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Foreground" Value="#FF0AD300"/>
            <Setter Property="BorderBrush" Value="#FF0AD300"/>

            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">                    
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
            </Style.Triggers>
        </Style>

        <Style x:Name="Name_Frage" TargetType="{x:Type TextBox}">
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="FontSize" Value="12"/>
            <Setter Property="Background" Value="Black"/>
        </Style>
        
    </Application.Resources>
</Application>
<Window x:Class="Stay_Alive.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Stay_Alive"
        mc:Ignorable="d"
        Title="Stay Alive!" Icon="K:\+++BEWERBUNG PRAKTIKUM+++\+++ eigene Programme +++\Stay_Alive\Stay_Alive\Symbol1.ico" Height="400" Width="798" ResizeMode="CanMinimize">
    <Window.Effect>
        <DropShadowEffect/>
    </Window.Effect>

    <StackPanel Background="{StaticResource gradientBackground}">
        <TextBlock Name="WelcomeWindow" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="53,50,52,50" TextWrapping="Wrap" FontSize="18" Foreground="#FF00FF07">
            <TextBlock.Effect>
                <DropShadowEffect/>
            </TextBlock.Effect><Run Text="Stay Alive ist eine kleine Story, in der es ums Überleben geht. Sie befindet sich noch im Ausbau, du kannst sie aber vorab testen."/></TextBlock>
        <TextBlock x:Name="WelcomeWindow_Frage" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="52,0,0,0" TextWrapping="Wrap" FontSize="18" IsEnabled="False">
            <TextBlock.Effect>
                <DropShadowEffect/>
            </TextBlock.Effect><Run Text="Möchtest du Teil dieses Abenteuers werden?" Foreground="#FF00FF07"/></TextBlock>
        <Grid Margin="10,20,30,20">
            <Grid.Effect>
                <DropShadowEffect/>
            </Grid.Effect>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Button Grid.Column="0" Grid.Row="1" Name="WelcomeWindow_B1_Ja" Margin="0,0,0,0" Click="WelcomeWindow_B1_Ja_Click">Ja</Button>
            <Button Grid.Column="1" Grid.Row="1" Name="WelcomeWindow_B2_Nein" Margin="22" Click="WelcomeWindow_B2_Nein_Click">Nein</Button>
            <Image Source="K:\+++BEWERBUNG PRAKTIKUM+++\+++ eigene Programme +++\Stay_Alive\Stay_Alive\Selfmade_Icon.ico" VerticalAlignment="Top" Grid.Column="3" Grid.Row="1" Name="WelcomeWindow_B3_Nein" Margin="52" Height="45" Width="100"></Image>
            <TextBox Grid.Column="3" Height="20" Width="65" Margin="112,70,0,45" Text="Version 1.0" Foreground="#FF00FF05" BorderBrush="Black" Background="Black" IsEnabled="False"/>
        </Grid>
    </StackPanel>
</Window>
<Window x:Class="Stay_Alive.name"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Stay_Alive"
        mc:Ignorable="d"
        Title="Stay Alive!" Icon="K:\+++BEWERBUNG PRAKTIKUM+++\+++ eigene Programme +++\Stay_Alive\Stay_Alive\Symbol1.ico" Height="450" Width="798" ResizeMode="CanMinimize">

    <StackPanel Background="{StaticResource gradientBackground}">
        <TextBlock Name="Name_Äxx" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="53,50,52,50" TextWrapping="Wrap" FontSize="18" Foreground="#FF00FF07">
            <TextBlock.Effect>
                <DropShadowEffect/>
            </TextBlock.Effect><Run Text="Hallo Fremder. Mein Name ist Äxx.Wenn du dieses Programm gefunden hast bedeutet das, dass das Virus ausgebrochen ist und zumindest DU überlebt hast. Wenn du bereit bist dir mein Gequatsche anzuhören und wirklich überleben willst, dann verrate mir vorerst deinen Namen:"/></TextBlock>
        <TextBox x:Name="Name_Frage" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="53,0,0,0" TextWrapping="Wrap" FontSize="18" Text="" Foreground="#FF00FF07" Width="270">
            <TextBox.Effect>
                <DropShadowEffect/>
            </TextBox.Effect>
        </TextBox>
        <Grid Margin="0,20" RenderTransformOrigin="0.499,0.926" Height="179">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Image Source="K:\+++BEWERBUNG PRAKTIKUM+++\+++ eigene Programme +++\Stay_Alive\Stay_Alive\Selfmade_Icon.ico" VerticalAlignment="Top" Grid.Column="3" x:Name="WelcomeWindow_B3_Nein" Margin="38,78,60,0" Height="45" Width="100"/>
            <TextBox Grid.Column="3" Height="20" Width="65" Margin="106,102,0,57" Text="Version 1.0" Foreground="#FF00FF05" BorderBrush="Black" Background="Black" IsEnabled="False"/>
        </Grid>
    </StackPanel>
</Window>



Sieht dann bisher so aus:

image.thumb.png.a45dd94787c2535d7bd4bb919064b79c.png
 

image.thumb.png.29cc325aa56d060cf8768c9572b358dc.png

 

 

Hier der Konsolencode, den ich einfach nur funktional in WPF visualisieren möchte :) :
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace StayAlive
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "";




            Begruessung(ref name);
            KraftBeweglichkeitAusdauer(ref name);
            Temperaturabfrage();

            Console.WriteLine("  :]   ");


            Console.ReadKey();
        }

        public static void Begruessung(ref string name)
        {
            Console.WriteLine("Hallo Fremder.");
            Console.WriteLine("Mein Name ist Äxx.");
            Console.WriteLine("Wenn du dieses Programm gefunden hast heißt das, dass das Virus ausgebrochen ist und zumindest DU überlebt hast.");
            Console.WriteLine("Wenn du bereit bist, dir mein Gequatsche anzuhören und wirklich überleben willst, dann verrate mir vorerst deinen Namen: ");
            name = Console.ReadLine();
            Console.WriteLine("Ich muss prüfen, ob du nicht in der Mitarbeiterdatenbank der 'W-H-A' auftauchst und mich nun ausspionieren willst..");
            Console.ReadKey();
            Console.WriteLine(".. progress 38%");
            Console.Write(".. progress 58%");
            Console.WriteLine(".. progress 100%"); Console.WriteLine();
            Console.WriteLine("No match found."); Console.WriteLine();
            Console.Write("Okay, {0}, Keine ID zu diesem Namen vorhanden.", name); Console.WriteLine();
            Console.WriteLine("Vorerst muss das reichen.");
            Console.WriteLine("Der Weg den wir beide bestreiten wird nicht leicht. Überall lauern die Auswirkungen des Virus. Tote, Lebendige,");
            Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine(" und die... dazwischen...... "); Console.WriteLine(); Console.WriteLine();
            Console.ResetColor(); Console.Write("Fangen wir lieber an uns vorzubereiten. "); Console.WriteLine();

        }

        public static string KraftBeweglichkeitAusdauer(ref string name)
        {
            Console.WriteLine("Um dir wirklich gute Tipps geben zu können, muss ich wissen, wie es um deine sportlichen Körperlichkeiten steht. Zunächst brauche ich dein Gewicht: ");
            string gewicht = Console.ReadLine();
            int geparsedGewicht = Int32.Parse(gewicht); Console.WriteLine();
            if (geparsedGewicht >= 80)
            {
                Console.WriteLine("Du bist sicherlich jemand mit viel Kraft. ");
            }
            if (geparsedGewicht < 80 && geparsedGewicht > 60)
            {
                Console.WriteLine("Ein Schwächling bist du sicher nicht. Aber wir sollten evtl. andere Wege offenhalten, wenn deine Stärken weniger in der Körperkraft liegen.");
            }
            if (geparsedGewicht <= 60 && geparsedGewicht >= 50)
            {
                Console.WriteLine("Um eine gesunde Balance zu den Attributen Kraft, Beweglichkeit und Ausdauer zu bekommen, solltest du auf jeden Fall -falls es die Situation zulässt- täglich deine Körperkraft trainieren. ");
            }
            if (geparsedGewicht < 50)
            {
                Console.WriteLine("Was? Hast du dich vielleicht vertippt? (y/n)");
                string abfrageVertippt = Console.ReadLine();
                if (abfrageVertippt == "y" || abfrageVertippt == "Y")
                {
                    Console.WriteLine();
                    Console.WriteLine("Zum Glück. Das wäre hart geworden, und die Chancen deines Überlebens hätten bei unter {0} % gelegen.", geparsedGewicht);
                    Console.WriteLine("Um ehrlich zu sein, in diesem Fall hätte ich dir nahegelegt Suizid zu begehen. Alles andere wäre Quälerei gewesen!");
                }
                else
                {
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine("Oha. ");
                    Console.WriteLine("....Schnuckelchen, in der Vitrine im Obergeschoss steht hochprozentiger Alkohol. Eine geladene Pistole wirst du im Wandschrank finden. Trinke dir Mut an, und dann lösche dich selbst aus, denn du hast keine Chance zu überleben. Machs gut {0}.... ", name); Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine("Deine Erbanlagen und das, was du aus deiner Gesundheit gemacht hast in deinem Leben, bewegt sich im unterirdischen Bereich. Letztlich bist du an einer Alkoholvergiftung gestorben, denn dein kleiner, dürrer Körper hat der alkoholischen Belastung nicht mehr stand gehalten. Mögliche Überlebende hatten nie die Chance die vorher erwähnte Pistole zu finden. Auch sie haben es nicht geschafft. Weil du so klein und dünn warst. ");
                    return "ENDE";
                }
            }

            Console.WriteLine();
            Console.Write("Aber wie steht es um deine Beweglichkeit? Würdest du sagen, dass du recht gelenkig bist? (y/n)");
            string abfrageBeweglichkeit = Console.ReadLine(); Console.WriteLine();
            if (abfrageBeweglichkeit == "y" || abfrageBeweglichkeit == "Y")
            {
                Console.WriteLine();
                Console.WriteLine("Das freut mich sehr! Mit dieser Information sind deine Überlebenschancen nach meinen Berechnungen gerade um 14 % gestiegen! ");
            }
            if (abfrageBeweglichkeit == "n" || abfrageBeweglichkeit == "N")
            {
                Console.WriteLine();
                Console.WriteLine("Das macht nichts. Aber wir sollten aufpassen, dass wir uns nicht in Situationen begeben, die gymnastisch eine hohe Beweglichkeit erfordern könnte..");
            }

            Console.Write("Nun zum wichtigsten aller Eigenschaften. Ausdauer. Wie schätzt du dich selbst ein, bist du ein Raucher mit chronischer Unlust zur Bewegung? (y/n)");
            string abfrageAusdauer = Console.ReadLine(); Console.WriteLine();
            if (abfrageAusdauer == "y" || abfrageAusdauer == "Y")
            {
                Console.WriteLine();
                Console.WriteLine("Hat dein Arzt dir nie gesagt, dass Rauchen ungesund ist!? Vermutlich hast du mit dem Qualmen angefangen, als alles um dich herum kontaminierte.. ich verstehe. ");
            }
            if (abfrageAusdauer == "n" || abfrageAusdauer == "N")
            {
                Console.WriteLine();
                Console.WriteLine("Super! Ausdauer ist das A und O. Wer mentale und körperliche Ausdauer vorweisen kann, der kann schon so gut wie alles erreichen im Leben.");
            }

            if ((abfrageBeweglichkeit == "y" || abfrageBeweglichkeit == "Y") && (abfrageAusdauer == "n" || abfrageAusdauer == "N"))
            {
                Console.WriteLine();
                Console.WriteLine("Deine körperlichen Voraussetzungen könnten kaum besser sein! Ehrlich, ich sehe eine gute Zukunft für dich. Wir schaffen das!");
            }
            if ((abfrageBeweglichkeit == "n" || abfrageBeweglichkeit == "N") && (abfrageAusdauer == "y" || abfrageAusdauer == "Y"))
            {
                Console.WriteLine();
                Console.WriteLine("Meine Bytes schulden dir Ehrlichkeit: Es wird sehr hart für dich. Hier können wir festhalten, dass deine Vorgehensweise niemals offensiv sein sollte. Du musst extrem deine Körperkraft pushen, sonst hast du einfach keine Chance!");
            }
            if ((abfrageBeweglichkeit == "y" || abfrageBeweglichkeit == "Y") && (abfrageAusdauer == "y" || abfrageAusdauer == "Y"))
            {
                Console.WriteLine();
                Console.WriteLine("Nun, es nützt nicht sehr viel, wenn du eine gute Beweglichkeit vorweisen kannst, aber keine Ausdauer hast. An der Stelle wird dich dein Verstand auffangen müssen. Aber mich hast du ja jederzeit in der Tasche.");
            }
            if ((abfrageBeweglichkeit == "n" || abfrageBeweglichkeit == "N") && (abfrageAusdauer == "n" || abfrageAusdauer == "N"))
            {
                Console.WriteLine();
                Console.WriteLine("Du bist nicht gelenkig, aber dafür ausdauernd? Nun. Nutze deine Ausdauer gut. Wenn du schlau bist und sich die Gelegenheit bietet, mache so oft du kannst Dehnübungen, vor allem bevor es körperlich anstrengend wird. Aber wenn du schon nicht allzu gelenkig bist, vernachlässige bloß deine Körperkraft nicht!");
            }

            Console.WriteLine();
            Console.WriteLine();
            return "ergebnisKraftBeweglichkeitAusdauer";
        }

        public static void Temperaturabfrage()
        {
            string yesOrNo = "c";
            int geparsedTemp = 0;

            do
            {
                Console.WriteLine("Die Welt ist hart da draußen. Sag mir, ob du einschätzen kannst, wie viel °C draußen in etwa herrschen: ");
                string temp = Console.ReadLine();
                Console.WriteLine("Die Temperatur beträgt {0} °C? (y/n)", temp);
                yesOrNo = Console.ReadLine();
                geparsedTemp = Int32.Parse(temp);
            }
            while (yesOrNo == "n" || yesOrNo == "N");

            Console.WriteLine("Danke für deine Offenheit!");


            if (geparsedTemp < 10)
            {
                Console.WriteLine("Wenn du ohne Jacke raus gehst, wird dir kalt! Unterkühlung in deiner Situation wäre ein Fehler, der lebensgefährlich werden kann! Außerdem hast du zusätzliche Taschen um wichtige Materialien zu verstauen.");
            }

            if (geparsedTemp == 10)
            {
                Console.WriteLine("Eine leichte Übergangsjacke wäre sinnvoll.");
            }

            if (geparsedTemp > 10 && geparsedTemp <= 15)
            {
                Console.WriteLine("Ein Pullover genügt völlig.");
            }

            if (geparsedTemp > 20 && geparsedTemp < 29)
            {
                Console.WriteLine("Dir wird auf jeden Fall ein T-Shirt reichen!");
            }

            if (geparsedTemp > 30)
            {
                Console.WriteLine("Geh lieber oben Ohne. Aber denk an eine leichte Kopfbedeckung!");
            }

            Console.WriteLine("Nun hast du die Klamottenfrage geklärt- kommen wir zu etwas Wichtigerem..");
        }




    }
}



Ist btw mein erstes WPF Projekt, und ich werde vermutlich nach diesen 2 Fenstern weitere "Seiten" hinzufügen und die "forward"+"backward"-Buttons entsprechend zu meinen Antwortmöglichkeiten verknüpfen. Bei den Zahleneingaben nehm ich z.B. einfach erstmal nen Slider. Und die Umsetzungsmöglichkeit für eine Art Lauftext suche ich auch schon eine Weile (will es halt möglichst einfach halten, damit ich auch wirklich selbst verstehen lerne was ich da tue)  :)  
Das Ding hat meiner Meinung nach für mich großes Potential, weil ich es Storytechnisch immer weiter ausbauen kann, und vor allem neue Kenntnisse (von weiteren folgenden Sprachen) in diesem Projekt mit kleinen Gimmiks immer weiter umsetzen kann. 

Nochmal besten Dank!

Fin

  • 0
Geschrieben

@KeeperOfCoffee
Ich weiß deine Mühe sehr zu schätzen, habe allerdings nur noch bis Freitag morgen Zeit (habe dieses Projekt als Klausurgegenstand gewählt). So richtig verstehe ich leider auch nicht was nun MVVM genau sein soll, bzw wo hier Unterschiede liegen (shame on me, bin ein echt krass langsamer Lerntyp, und ich stehe quasi noch in the very beginning..)
 

- Was ist das INotifyPropertyChanged Interface?
- Was ist ein Datacontext?
- Was ist eine ObservableCollection?

Geht das in die Richtung MVVM? (sry für die blöden Fragen, ich checks einfach nicht)

  • 0
Geschrieben (bearbeitet)

 

vor 12 Stunden schrieb Finux:

MVVM genau sein soll

MVVM wurde durch Microsofts Software Architekten Ken Cooper und Ted Peters erfunden. MVVM ist ein Software-Architekturpattern welches die Trennung der Entwicklung der UI von der Entwicklung der Geschäftslogik oder der Back-End Logik ermöglicht. Hierbei ist das "ViewModel" die Klasse die sozusagen sämtliche Daten und auch Methoden besitzt. Wenn du also ein vorgegebenes Model hast (z.B. aus einer Datenbank), dann stellst du sämtliche Daten die du benötigst hier dar bzw. arbeitest hier mit diesen. Auch Anzeigelogik wird hier gesteuert.

Sagen wir du hast einen Button, der nur unter verschiedenen Konditionen Enabled werden soll. Du hast die View erstellt (das Markup) und bei "IsEnabled" hast du ein entsprechendes Binding erstellt. Wie dieses Binding lautet muss der Entwickler des Businesslogik wissen. Er entwickelt die Logik die sicherstellt, ob dieser Button Enabled ist. Der UI Entwickler kann sich um andere Dinge kümmern.

MVVM findest du in .NET, Silverlight, Angular, Vue.js. JavaFX (habe ich mal gehört jedenfalls) und anderen Frameworks.

vor 12 Stunden schrieb Finux:

Was ist ein Datacontext?

Wenn man mit WPF arbeitet (also mit XAML), dann definiert der DataContext, mit welcher Klasse die aktuelle View sozusagen verbunden ist. Oben habe ich ja denn Fall mit dem Button und IsEnabled beschrieben. Das Markup muss ja wissen, wo der derzeitige Wert für IsEnabled dieses Buttons ist. Dieser befindet sich als bool in der entsprechenden Klasse, zusammen mit Logik die den Wert dieses bools verändern kann.

 

vor 12 Stunden schrieb Finux:

Was ist das INotifyPropertyChanged Interface?

Ist ein Standardinterface von .NET. Wird gebraucht für das OnPropertyChanged, welches die UI mitteilt, dass ein Property sich verändert hat:

https://docs.microsoft.com/de-de/dotnet/api/system.componentmodel.inotifypropertychanged?view=netframework-4.7.2

vor 12 Stunden schrieb Finux:

Was ist eine ObservableCollection

https://docs.microsoft.com/de-de/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.7.2

da wie du siehst, diese bereits INotifyPropertyChanged implementieren. Das bedeutet, sehr vereinfacht gesagt, die OC WEIß wenn ein Element der OC sich verändert hat und gibt diese Info auch an die UI weiter. Ein Aufruf von OnPropertyChanged ist also auf eine OC nicht nötig.

Wenn du eine normale List verwenden würdest, müsstest du bei jeder Operation, die diese Liste betrifft, ein OnPropertyChanged verwenden, damit die Klasser der UI weitergibt, dass die List sich verändert hat.

 

Mich würden auch mal @Errraddicator und @Whiz-zarD Meinung hier interessieren, ihr postet doch öfters in C# Themen. 

In deinem Fall bräuchtest du also Bindings auf deinen Dargestellten Text, Commands für die Buttons, und ein ViewModel welches die Properties darstellt für die TextBindings und den Commands.

Bearbeitet von KeeperOfCoffee

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...