Bin ein wenig weiter gekommen.
Bei der Verwendung von RDLC:
Was noch fehlt:
Hallo Zusammen,
Mühsam kämpfe ich mich langsam in die Welt des MVVM... Dank dem Communitytoolkit ist das auch gar nicht so schwer.
Ich habe mir jetzt eine Anwendung erstellt, mit der ich Messdaten aufzeichne. Der Benutzer gibt zudem noch diverse Angaben an. Anschließend soll das ganze ausgedruckt werden. Hier kommen wir zum Problem.
Bei meiner alten WinForms Anwendung hatte ich eine extra Bericht-Form gemacht, kurz geöffnet, screenshot und dann das Bild gedruckt. Gab somit halt die beste Auflösung.
In WPF bin ich noch nicht ganz durch, welche Methode am einfachsten ist? Könnt ihr mir hierfür ein paar Tipps geben?
Ich habe mir RDLC von MS geladen und integriert. Ist quasi ähnlich wie meine alte Methode. Allerdings hänge ich nun länger bei dem verknüpfen der Variablen? Wie kann ich die Werte aus meiner DTO in diesen Bericht bringen und wie drucke ich dann den Bericht aus? Kann mir da jemand aushelfen?
Meine DTO ist eine extra Klasse :
using CommunityToolkit.Mvvm.ComponentModel;
using System.Xml.Serialization;
using System;
namespace SPs2.DataIO
{
[XmlRoot("Forstseilwinde10t")]
public partial class Forstseilwinde10tDTO : ObservableObject
{
[ObservableProperty]
private Metadaten meta = new Metadaten();
[ObservableProperty]
private Kundendaten kunde = new Kundendaten();
[ObservableProperty]
private TechnischeDaten technik = new TechnischeDaten();
[ObservableProperty]
private Sichtprüfung sp = new Sichtprüfung();
[ObservableProperty]
private Zugprüfung zp = new Zugprüfung();
// -----------------------------------------
// Metadaten
// -----------------------------------------
public partial class Metadaten : ObservableObject
{
[ObservableProperty]
private string dateityp = "";
[ObservableProperty]
private int version = 1;
}
// -----------------------------------------
// Firmendaten
// -----------------------------------------
public partial class Firmendaten : ObservableObject
{
[ObservableProperty]
private string firmenname = string.Empty;
[ObservableProperty]
private string firmenstraße = string.Empty;
[ObservableProperty]
private string firmenOrt = string.Empty;
[ObservableProperty]
private string firmenTelefon = string.Empty;
[ObservableProperty]
private string firmenEmail = string.Empty;
[ObservableProperty]
private string firmenPrüfer = string.Empty;
[ObservableProperty]
private string maschinennummer = string.Empty;
}
// -----------------------------------------
// Kundendaten
// -----------------------------------------
// ..... und so weiter....
Servus,
mit dem Webview hatte ich noch keinen Kontakt, daher kann ich dir das nicht sagen.
Auf die schnelle hab ich das hier gefunden:
https://github.com/AdysTech/CredentialManager
https://learn.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection
Eventuell hilft dir das weiter.
Meine Lösung würde ich beginnen beim laden der Form, prüfen ob Datei vorhanden, wenn ja, auslesen und in Textboxen ausgeben. Checkbox auf true setzen.
Beim klick auf Login, wenn checkbox.checked=true, String aus Textboxen in diese xml speichern. Wenn Checkbox false, Datei löschen.
private void Window_Loaded()
{
if (File.Exists(PfadZurLoginXML){ LadeLogindatenAusXML(); }
}
private void Loginbutton_click()
{
if (CheckBox.checked= true){ SpeicherLoginXML(); }
if (!CheckBox.checked= true){ LöscheLoginXML(); }
// Weiterer Login-Code
}
Servus Matthias,
Ich kenne mich damit nicht bestens aus, versuche es aber mal 😃
Ich vermute, dass webViewCharts.CoreWebView2.Settings.IsGeneralAutofillEnabled = true; deine Logindaten nur während der Laufzeit speichert. Bedeutet wenn du die Anwendung schließt, werden alle Variablen wieder auf Standard gesetzt.
Ich würde folgendes machen:
Wenn du den Haken setzt bei Login merken →
XML Datei erstellen, wenn nicht vorhanden →
Darin speicherst du Login + Passwort →
Serialisieren.
Bei FormLoad() Event dann diese Datei:
Prüfe ob vorhanden →
Deserialisieren →
Werte auslesen und eintragen.
Man könnte noch ergänzen wenn der haken nicht gesetzt ist:
Datei löschen wenn vorhanden.
Ich hoffe du verstehst das. Wenn du Hilfe mit dem Code brauchst mach Meldung. 😃
EDIT:
Ich hatte mal gesehen, dass man solche Sachen in der Projektmappe auch ablegen kann ohne extra eine Datei zu erstellen. Diese konntest du dann ganz einfach aufrufen mit bspw.:
XDocument xmlLogin = Properties.Resources.Logindatei;
Eventuell bringt dir das was
Danke für eure Beiträge!
Großen Dank für deinen umfangreichen Beitrag @MisterSparkle! Ich habe mittlerweile eine Grundlage die wohl MVVM entspricht. Allerdings lese ich immer häufiger von diesem Comm.Toolkit.MVVM. Sachen wie RelayCommand uvw, dazu muss ich mich noch mehr einlesen.
Danke euch!
Edit: Habe ein gutes Video zum Com.Toolkit.MVVM gefunden: Youtube
Hallo Zusammen,
ich habe bisher immer mit WinForms meine Anwendungen geschrieben. Soweit immer sehr zufrieden stellend für meine Anwendungen.
Mein Langzeitprojekt ist mittlerweile allerdings ziemlich grenzwertig aufgrund des zunehmenden Umfangs. Hatte zuletzt eine vermeintlich "einfache" Erweiterung, mit der Verkettung der nachfolgenden Problemen hatte ich nicht gerechnet.
Ich habe viel im Netz und auch hier wieder gelesen, wie ich das ganze strukturierter hinbekomme. Für die meisten hier nichts neues, für mich schon. WPF + MVVM. Das wirft bei mir sehr viele Fragen auf, die sich erfahrungsgemäß erst mit der Zeit klären. Zu Beginn würde ich gern von euch wissen wollen:
-Gibt es für hierfür ein definiertes Schema, sprich eine vorgegebene Art und Weise mit diesem pattern zu arbeiten?
-Kennt jemand ein dazu passendes Video? Ich habe mir auf Udemy bereits zwei Kurse zum Thema WPF gekauft, allerdings spricht keiner über MVVM. (Ich lerne mit Videos nunmal besser als lesen 😃 )
Wie das MVVM Schema auszusehen hat bzw. wie das letztendlich funktionieren soll ist mir mittlerweile bewusst. Ich habe allerdings viele verschiedene Methoden gesehen, damit zu starten und weiß aktuell nicht wirklich was Sinn macht.
Ein Dozent hat im Prinzip ein csproj in der Projektmappe, mit den entsprechenden Ordnern Model/View/ViewModel und legt dort die entsprechenden Klassen, Formen usw. ab. Passt ja soweit eigentlich, allerdings hat er dann mit dem CommunityToolkit.MVVM im CodeBehind trotzdem Methoden geschrieben, die er dann bindet?
[RelayCommand]
private void GenerateSampleData()
{
Person=new Model.SomplePerson();
Person.FirstName=";
und noch mehr Attribute...
}
Verstehe nicht, ist das eine Art von MVVM? Kommt mir nicht so vor?
Ein weiterer Dozent hat das ganze ziemlich Interessant angefangen: In der Projektmappe hat er gesamt drei Projekte erstellt. MyApp_.UI && MyApp_.Logik && MyApp_.Daten
Anschließend werden die Abhängigkeiten gesetzt in VS und dann legt er los. Das würde ich, als Unwissender, als MVVM einschätzen?
Bitte gebt mir doch mal Infos, wie ich überhaupt starten muss?
Danke! 😃
Guten Morgen zusammen und dankeschön für die Rückmeldungen!
Die Variante mit dem auslagern in einen extra Thread gefällt mir recht gut. Da der Prüfvorgang mit 60 Sekunden + Wartezeit auf Bedingung (Erreichen des Startwertes) sowieso als längere Aufgabe zählt, werde ich das versuchen so umzusetzen.
Eventuell könnte mir noch jemand einen Tipp geben, wie ich verhindern kann, dass der "Backgroundworker" nicht sofort seine Arbeit beendet?
Ich starte ihn mit einem Button und dieser sollte dann eben in die while-Schleife gehen bis ich den bool zeitVorbei==true setze.
Allerdings wird die Schleife gar nicht erst aufgerufen... Hab ich was übersehen?
Codeschnipsel:
private void InitializeBackgroundWorker()
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += BackgroundWorker_Arbeit;
backgroundWorker.RunWorkerCompleted += BackgroundWorker_WorkerFertig;
backgroundWorker.ProgressChanged += BackgroundWorker_Fortschritt;
backgroundWorker.WorkerReportsProgress = true;
}
private void StartBackgroundWorkButton_Click(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
{
// Starte den BackgroundWorker.
backgroundWorker.RunWorkerAsync();
}
}
private void BackgroundWorker_Arbeit(object sender, DoWorkEventArgs e)
{
while (zeitVorbei == false)
{
// Diese Methode wird im Hintergrund ausgeführt.
Console.WriteLine("Worker aktiv");
if (this.druckkraft_ist < this.startDruck)
{
Console.WriteLine("Schleife klein aktiv");
}
if (this.druckkraft_ist > this.startDruck)
{
Console.WriteLine("Schleife groß aktiv");
for (int i = 0; i <= 100; i++)
{
picbox_Klartextanzeige.BackColor = Color.Lime;
lbl_Klartextanzeige.BackColor = Color.Lime;
lbl_Klartextanzeige.Text = " Druck erhöhen auf " + this.variablenSpeicher.Druckkraft + " kN\n" + " Startdruck ist " + this.startDruck + " kN";
if (this.druckkraft_ist > this.startDruck)
{
if (this.druckkraft_ist > druckKraft)
{
picbox_Klartextanzeige.BackColor = Color.YellowGreen;
lbl_Klartextanzeige.BackColor = Color.YellowGreen;
lbl_Klartextanzeige.Text = "Druck erhöhen auf " + this.überDruck + " kN";
}
}
backgroundWorker.ReportProgress(i);
}
}
else
{
Console.WriteLine("Nichts");
}
//Thread.Sleep(333);
}
}
private void BackgroundWorker_Fortschritt(object sender, ProgressChangedEventArgs e)
{
// Diese Methode wird aufgerufen, wenn der BackgroundWorker den Fortschritt meldet.
progbar_Prüfzeit.Value = e.ProgressPercentage;
}
private void BackgroundWorker_WorkerFertig(object sender, RunWorkerCompletedEventArgs e)
{
// Diese Methode wird aufgerufen, wenn der BackgroundWorker seine Arbeit beendet hat.
if (e.Error != null)
{
// Wenn während des Hintergrundprozesses ein Fehler aufgetreten ist.
MessageBox.Show("Fehler aufgetreten: " + e.Error.Message);
}
else
{
// Wenn die Aufgabe erfolgreich abgeschlossen wurde, aktualisiere das Label.
picbox_Klartextanzeige.BackColor = Color.Red;
lbl_Klartextanzeige.BackColor = Color.Red;
lbl_Klartextanzeige.Text = " Prüfung beendet";
}
}
Okey danke für die Info! Dann werde ich mich mal damit auseinander setzen und die Methode in einem extra Thread laufen lassen.
Dankeschön! 😃
Hallo Zusammen,
Benötige wieder einen Denkanstoß
Soll:
Über einen Button wird die "Prüfung" gestartet. Anschließend muss der Anwender eine Maschine Bedienen um den Messwert zu erhöhen. Eine Progressbar soll nach dem erreichen des Startwertes (50) 60s lang laufen. Die Messwerte (3 Werte / Sekunde) werden aufgezeichnet und in einem Graph ausgegeben.
Problem:
Nach dem Klick auf den Button wird der Code darin nicht mehr ausgeführt. Mit einer While-Schleife lege ich auch alles Lahm. Das Pgm soll weiterlaufen. Dabei soll aber auf die Bedingung (Startwert) "gewartet" werden und anschließend weiterer Code ausgeführt werden.
Vielleicht kann mir ja jemand einen Tipp geben, wie ich das angehen kann? 😃
Dankeschön!
Hirnknoten gelöst. Vielen Dank!!!
Alter Codeschnipsel:
private Variablenspeicher variablenSpeicher;
Neuer Codeschnipsel:
private Variablenspeicher variablenSpeicher = new Variablenspeicher();