Hjälp med WPF/C# och byta TextBlock content vid button.click

Permalänk
Inaktiv

Hjälp med WPF/C# och byta TextBlock content vid button.click

Jag försöker göra ett flowchart, i frågeform ("ja eller nej"-frågor).
Detta ska då göras i WPF med C# (ej XAML).

Jag har då tänkt att ha ett TextBlock i mitten som ska innehålla varje ny fråga.
Och två Buttons nedtill, en med "ja" och en med "nej".

När man trycker på en Button så ersätts frågan (TextBlock) i mitten med en ny fråga (vilken fråga beror på vilken Button man klickade på)

Jag har dock helt låst mig och vet inte hur jag ska få till att det visas en ny fråga i mitten av mitt window.

Det är ju en sak att bara göra så här:

TextBlock question = new TextBlock { Text = "Is this a question?", FontSize = 20, TextAlignment = TextAlignment.Center }; mainGrid.Children.Add(question); Grid.SetColumn(question, 0); Grid.SetRow(question, 2); Grid.SetColumnSpan(question, 2);

Men att få detta block att visa ny fråga vid ett klick på en av knapparna, och sedan styra vilken fråga det blir, det är där jag kört fast.

Man kan ju lägga till

yes.Click += Yes_Click;

och

private void Yes_Click(object sender, RoutedEventArgs e) { }

För att få event på knapptryckningarna, men vet inte hur jag sak börja pussla ihop allt för att få till alla frågor, var de ska läggas, hur de ska styras till ett specifikt knapptryck osv...

(Jag har gjort denna flowchart i konsolen innan, i form av en rejäl bunt av console.writeline och IF-satser. men försöker nu alltså få till det i WPF istället)

Någon som kan försöka sig på att putta mig i rätt riktning?
(Det är inget prov, ingen inlämningsuppgift eller liknande. Helt enkelt bara mitt sätt att träna på WPF som är en del i kursen, för jag förstår i nuläget null)

Permalänk
Medlem

@anon170706: Hej! Jag kan testa i alla fall att putta lite åt rätt håll, var många år sedan jag satt med Web/WinForms/WPF så ta mitt svar med en nypa salt.

Men exempelvis i kodblocket som hanterar vad som sker vid klick på en knapp, så borde du direkt där bara kunna ha skiftet av texten som skall presenteras i textblocket. Exempelvis:

private void Yes_Click(object sender, RoutedEventArgs e) { question.Text = "This is another question"; }

I samma kodblock, lite beroende på hur din struktur ser ut överlag, borde du kunna ha en check för vilken fråga det är som besvaras, en enkel variabel som agerar räknare exempelvis då jag antar att svaren sparas in i en Array eller liknande.

int questionNumber = 1; private void Yes_Click(object sender, RoutedEventArgs e) { // Check för att kontrollera vilken fråga det gäller, sedan spara in fråga + tillhörande svar i en array // Slutligen uppdatera texten för nästa fråga question.Text = "This is another question"; }

EDIT: Jag utgår här från att TextBlock fungerar lite liknande som en Label, så kanske inte alls är fallet insåg jag, så som sagt en nypa salt till mitt svar.

EDIT 2: En till poäng här är att för "Nej-knappen" blir koden i princip densamma, att bryta ut hanteringen i en separat metod som kallas på kan vara bra, för att inte bryta mot DRY principen.

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk

@anon170706: Kul att se att det finns fler som är intresserade av just C# / WPF.
När det kommer till WPF så får du försöka dela upp det i två delar, front & back-end.

Du har ju din front-end vilket består utav XAML, det är ett markup språk precis som HTML, vilket betyder att det består utav nodes för att skapa element, men attributes som `Background` etc.

Sen har du ju "The business logic" eller logiken bakom din front-end.
Detta kan användas som WinForms eller Console, där du helt enkelt skapar routed events.
Men WPF är inte gjort för att användas på sådant vis, helst så ska du använda dig utav något som heter MVVM (Model View View-Model)
vilket är en architectural design pattern som är uppbyggd på seperation of concern.

Det gör det oerhört enkelt att arbeta med både front och backend.
Kastar in det där så att du har lite att tänka på och vet ungefär vilket håll du ska åt.

När det gäller din fråga så skulle jag rekommendera att du fortsätter som du gör med dina routed events men även använder dig utav XAML för att skapa dina element, ge dem ett namn attribute och sedan kalla på dem via koden.

T.ex
<Button x:Name="BtnStart"/>

Sen i din kod så kan du kalla BtnStart och sen så trycker du på `.` och så får du fram alla knappens attributes som du kan leka med.
T.ex BtnStart.Text = "New text value";

Hoppas det här hjälper, är det så att du fortfarande sitter fast så hjälper jag dig gärna via Discord eller liknande.
Lycka till!