Warum kann man das WebView nicht sehen?

2 Antworten

Die Run-Methode wird implizit aufgerufen, so lange es ein Application-View gibt. Entferne also entweder den Aufruf in Zeile 99 (App.xaml.cs) oder stelle grundsätzlich einen eigenen Einstiegspunkt für die Anwendung bereit.

Beispiel:

public class Main
{
  [STAThread]
  public static void Main()
  {
    MyApplication app = new MyApplication();
    app.Run(new MainWindow());
  }
}

public class MyApplication : Application
{
}

Das Standardtemplate sieht vor, dass die Application-Instanz automatisch generiert wird und eine MainWindow-Instanz öffnet (siehe StartupUri in der App.xaml).

View-Logik im Backend zu definieren, ist im Übrigen immer unschön. Das WebView gehört in die MainWindow.xaml.

<Window ...
  xmlns:browser="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf">
  <Grid>
    <browser:WebView2 Source="https://www.google.com" />
  </Grid>
</Window>

Die Komponente kann auch von außen angesprochen werden, wenn man ihr einen Namen zuweist.

MainWindow.xaml:

<browser:WebView2 x:Name="MyWebView" />

MainWindow.xaml.cs:

public MainWindow()
{
  InitializeComponent();
  MyWebView.Source = new Uri("https://www.google.com");
}

Lass im MainWindow die Zeilen mit Visibility weg - ist default.

Lass im MainWindow Width und Height weg, damit verhinderst Du, dass die WebView immer die gleiche Größe hat, wie das Window.

Wirf in der App.xaml die StartupUri-Eigenschaft raus, das würde das MainWindow automatisch öffnen, aber Du willst ja noch was Eigenes machen.

Wirf den ganzen Code im App-Konstruktor weg, der wird ausgeführt, noch bevor die App gestartet wurde. Du startest mit deinem Code im App-Konstruktor die App und in der Main-Methode (wird automatisch generiert) nochmal - das geht schief.

Ein Window zeigt man mit window.Show() oder window.ShowDialog() an.

Überschreibe in der App.xaml.cs die OnStartup-Methode, die ist für sowas (Dinge beim Start) gedacht. Da hast Du auch die Prozess-Args und die App wurde geladen und der ganze nötige Rest (z.B. Dispatcher) ist auch schon da.

======================

Das alles erklärt aber nicht, warum Du die WebView nicht siehst, der Fehler liegt also nicht am WPF spezifischen Code.

Ich vermute mal, dass der ganze Inhalt, den Du im Loaded-EventHandler hast, einfach zu lange dauert. Das Loaded-Event wird auf dem UI-Thread ausgeführt und dein Handler damit auch - dein ganzer Code blockiert also den UI-Thread und verhindert, dass der Rest weiter arbeitet - also die WebView anzeigt.

Du musst entweder asynchron arbeiten (Netzwerk ist sowieso prinzipiell asynchron, die synchronen Methoden sind nur ein mieser Hack von Microsoft) oder das alles in einen eigenen Thread auslagern, musst dich dann aber auch selber um die Synchronisation kümmern.
Beides ist kein einfaches Thema und da solltest Du dich definitiv vorher einarbeiten. Am Ende würde ich aber zu async raten, das ist zwar auch kompliziert und für "Magie" im Hintergrund, aber es ist mMn. einfacher, als klassisches Multi Threading "zu Fuß".
Und ich rate dir, den ganzen Python-Kram in eine eigene Klasse auszulagern, das hilft sehr bei der Übersicht.

======================

Und der allgemeine Stil XAML vs. C# (auch weil regex9 es anspricht).

Ja, normalerweise solltest Du das im XAML machen, dafür wurde WPF entwickelt.
Allerdings, wenn es wirklich nur die WebView2 bleibt, ist das eigentlich egal. Sobald Du aber mehr machst, solltest Du definitiv zum XAML wechseln und am besten noch mit MVVM arbeiten. Mit den DataBinding ersparst Du dir auch das nervige hin und her mit den Daten in der UI, das passiert alles automatisch.

======================

Ach ja und TcpClient:

Sicher, dass Du das willst? Das sieht für mich so aus, als würdest Du zwischen zwei Prozessen kommunizieren wollen, weißt aber nicht, dass es zig bessere Möglichkeiten gibt :D

Ich kenne dein Vorhaben nicht, aber ich rate einfach mal, dass eine simple Web-API ausreicht und ich gehe stark davon aus, dass es für Python auch Frameworks gibt, die das gut und einfach können.
Umgekehrt gibt's im .NET-Umfeld auch einfache Möglichkeiten, eine Web-API anzusprechen, ich rate zum Framework "Refit", das generiert 90% des Codes automatisch für dich - funktioniert aber nur, wenn es übliche HTTP-Calls sind - aber ein Test lohnt. Das arbeitet allerdings durchgehend asynchron oder alternativ mit dem Observer-Pattern, musst Du dir überlegen, was für dich einfacher ist.

Also stelle es am besten auf eine WebApi um, das ist nicht nur einfacher und übersichtlicher, sondern Du hast auch ein deutlich stabileres System, für das auch zukünftige Änderungen/Erweiterungen deutlich einfacher sind.

Woher ich das weiß:Berufserfahrung