Fehler im Designer beim Laden der MainWindow.xaml

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Fehler im Designer beim Laden der MainWindow.xaml

    Hey Guten Abend allerseits,

    ich hab grad ein Problem beim Laden der MainWindow.xaml im Designer, siehe Screenshot.

    Der volle Fehlertext ist:

    Spoiler anzeigen
    bei FileAndFolderBrowser.ViewModel.FolderBrowserViewModel.VB$StateMachine_13_RegistrierungNotwendig.MoveNext() in C:\Users\alpha\Documents\eigene\Programme\at work\Testprogramme\VALP3 API Test\FileAndFolderBrowser\FileAndFolderBrowser\FileAndFolderBrowser.ViewModel\FolderBrowserViewModel.vb:Zeile 263.
    --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
    bei FileAndFolderBrowser.ViewModel.FolderBrowserViewModel.VB$StateMachine_9_Registrierung.MoveNext() in C:\Users\alpha\Documents\eigene\Programme\at work\Testprogramme\VALP3 API Test\FileAndFolderBrowser\FileAndFolderBrowser\FileAndFolderBrowser.ViewModel\FolderBrowserViewModel.vb:Zeile 44.
    --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    bei System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)
    bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
    bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)


    Zeile 263 sieht so aus:

    VB.NET-Quellcode

    1. AuthFileDateiName = Mainmodule.Arbeitsverzeichnis & "\auth.config"


    und Zeile 44 so:

    VB.NET-Quellcode

    1. If Await RegistrierungNotwendig() Then


    Komischerweise läuft das Programm wenn ich es kompiliere und starte....

    Weiss jemand Rat?
    Bilder
    • mainwindow.PNG

      35,22 kB, 710×478, 63 mal angesehen
    Offensichtlich wird bei dir zur Designzeit Code ausgeführt, der zur Designzeit nicht funktioniert.
    Bei der Initialisierung der Viewmodels muss man Sorge tragen, dass da zur Designzeit nicht auf Dateien oder Datenbanken oder INet zugegriffen wird.
    Hingegen zur Laufzeit will man natürlich sein Viewmodel mit sinnvollen Stammdaten initialisieren.
    Das ist bei mir ein Pattern der Anwendungsstruktur, dass zur Designzeit code-generierte Dummi-Daten geladen werden, und zur Laufzeit richtiges Brot.
    Man braucht natürlich eine Methode dafür, um Design- und Lauf-Zeit unterscheiden zu können.

    Scheinbar läuft da bei dir sogar was mit Await ab - das sollte wirklich nur zur Laufzeit genutzt werden.
    Edit:
    Hat sich (vorerst) erledigt. MainWindow.xaml wird wieder in den Designer geladen. Aber fragt mich jetz nicht warum. Eigentlich hatte ich bereits mehrfach Projekt Neu Erstellen und Projekt neu laden ausprobiert...
    _________________________________________________
    Edit2:
    So und eine Minute später taucht das Problem wieder auf :(
    ____________________________________________________
    Sorry Leute, war gestern etwas kurz angebunden, steckte mitten in einem anderen Bug und bin nicht wirklich ein MultiTasking-Talent. Jetzt aber richtig:

    Ich hab jetzt mal das hier probiert:

    VB.NET-Quellcode

    1. Public Sub New()
    2. 'If Me IsNot Nothing Then 'ES wird keine MsgBox gezeigt, ob mit oder ohne If...End If
    3. MessageBox.Show("FolderBrowserVm loaded.")
    4. 'End If
    5. If Not IsInDesignMode Then
    6. Registrierung()
    7. End If
    8. End Sub


    Die MessageBox wird nicht angezeigt, auch wenn ich die If-Bedingung weglasse.

    Auch das IsInDesignMode scheint nicht wirklich zu fruchten. Da steckt folgender Code dahinter:

    VB.NET-Quellcode

    1. Private Shared ReadOnly HostProcesses As New List(Of String)({"XDesProc", "devenv", "WDExpress"})
    2. Public ReadOnly Property IsInDesignMode As Boolean
    3. Get
    4. Return HostProcesses.Contains(Process.GetCurrentProcess().ProcessName)
    5. End Get
    6. End Property


    Ein Klick auf die oberen beiden Links auf dem Screenshot "msdocs" hilft auch nicht.

    Beim Klick auf den unteren Link werde ich auf eine Seite von Microsoft Learn weitergeleitet, da steht Folgendes: (s.Screenshot "msdocs"), was echt vielverprechend klingt...

    Nur leider ist bei mir dieser ToggleButton ausgeblendet (s. Screenshot "designer")

    Habt ihr vielleicht ne Idee wie ich diesen Button wieder einblende bzw. gibts da ne alternative Methode?

    Oder @ErfinderDesRades welchen Code benutzt du, um ein Ausführen von Code zur Designzeit zu verhindern. Denn mein Code greift tatsächlich asynchron auf das Internet zu...
    Bilder
    • designer.PNG

      17,9 kB, 511×251, 48 mal angesehen
    • msdocs.PNG

      51,88 kB, 953×428, 53 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()

    Ich habe in der App.xml die void OnStartup überschrieben. Die wird nur während der Laufzeit durchlaufen. Du fügst glaub ich auch dort seine "Services" hinzu, dann kannste gucken ob die "Services" erstellt wurden. Zur Designzeit können die dann ja nicht existieren. Falls du das anders machst, einen bool in die Klasse, der in der void OnStartup auf True gestellt wird. So kannst richtig du zuverlässig testen. Sollten die Benamungen eines Tages geändert, würde deine IsInDesignMode immer false rausgeben und du merkst evtl. nicht mal warum.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DTF schrieb:

    Ich habe in der App.xml die void OnStartup überschrieben. Die wird nur während der Laufzeit durchlaufen. Du fügst glaub ich auch dort seine "Services" hinzu, dann kannste gucken ob die "Services" erstellt wurden.


    Du meinst in der Application.xaml.vb bzw. App.xaml.cs? Was meinst du mit "überschrieben"?

    Ich habe in der Application.xaml das hier rausgenommen:

    XML-Quellcode

    1. <StartupUri="MainWindow.xaml">


    und in der Application.xaml.vb hab ich jetzt das hier:

    VB.NET-Quellcode

    1. Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
    2. ViewModel.Services.ServiceContainer.Instance.AddService(Of ViewModel.Services.IWindowService)(New Services.WindowService())
    3. ViewModel.Services.ServiceContainer.Instance.AddService(Of ViewModel.Services.IDialogWindowService)(New Services.DialogWindowService)
    4. Dim ZK = New Services.ZentraleKlasse
    5. ZK.MainDispatcher = Dispatcher
    6. ViewModel.Services.ServiceContainer.Instance.AddService(Of ViewModel.Services.IZentraleKlasse)(ZK)
    7. ZK.IsRunning = True
    8. ViewModel.Services.ServiceContainer.Instance.AddService(Of ViewModel.Services.IMainWindowService)(New Services.MainWindowService)
    9. ViewModel.Services.ServiceContainer.GetService(Of ViewModel.Services.IMainWindowService).OpenWindow(1000, 500, "Hauptfenster", Nothing, Me)
    10. End Sub


    und dann in meinem FolderBrowserViewModel das hier:

    VB.NET-Quellcode

    1. Public Sub New()
    2. If MainModule.IsRunning Then
    3. Registrierung()
    4. End If
    5. End Sub


    Aber das schafft leider keine Abhilfe... War das so von dir gedacht?

    kafffee schrieb:

    Was meinst du mit "überschrieben"?

    override

    In C# können wir Events nicht wie in VB nutzen( Handles Me.Startup ). Entweder muss ich selbst den Einstiegspunkt anlegen, was aber schon automatisch generiert wird(App.g.cs) und dort kann ich das Event nicht abbonieren.
    Aber ich kann auch einfach so die void überschreiben: Da ist das so einfacher.

    C#-Quellcode

    1. public partial class App : Application
    2. {
    3. protected override void OnStartup(StartupEventArgs e)
    4. {
    5. base.OnStartup(e);
    6. //wird dann einmal beim starten der App ausgeführt.
    7. }
    8. }


    Und nein so war das nicht gedacht. teste ob deine Services existieren, die können so ja nur zur Laufzeit existieren. Services da = Laufzeit, Keine da = Designtime. Sowas hab ich dir so meine ich aber schon mehrfach gesagt, zumindest was derartiges.

    Du kannst also einfach eine function reinmachen in deine klasse die die Services managed,

    C#-Quellcode

    1. public static bool ServicesExists()
    2. {
    3. return DeinServiceDictionary.Count > 0;
    4. }


    Wenn dann ServicesExists true gibt, weist du: Laufzeit.

    Auch solch ein Konstrukt wäre denkbar:

    C#-Quellcode

    1. public bool Runtime { get; private set; } = false;
    2. protected override void OnStartup(StartupEventArgs e)
    3. {
    4. base.OnStartup(e);
    5. Runtime = true;
    6. }


    Man, keine Vorstellungskraft/Fantasie? Auf so was einfaches kann man durchaus kommen. Oder ist deine isRunning in ZK sowas? Ist aber auch unsinn, wenn das zum Laufzeittest dienen soll, Zur Designtime exisiert noch keine instanz davon, du kannst deine ZK also nicht fragen, weil nich da. Da kannste genausogut fragen ob der Service existiert, also hast du eine vermutlich sinnlose Funktion in der Klasse. Ich glaube wirklich du hast Probleme mit deinem Programmaufbau/der Architektur. Immer wieder schiesst du dir selbst ins Bein.

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „DTF“ ()