Probleme / Verständnisprobleme Browser mit CefSharp VB.Net

  • VB.NET
  • .NET 5–6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Probleme / Verständnisprobleme Browser mit CefSharp VB.Net

    Sehr geehrte VB Community,

    ich bin noch komplett neu hier und ebenfalls neu in dem Theme Programmierung :)

    Ich habe mich dazu entschlossen ein Einstiegsprojekt umzusetzen (Ja wie immer der Browser) :D

    Jetzt steh ich vor 2 Problemen und auch durch Recherche kam ich einfach auf keine vernünftige Lösung... gut vielleicht liegts auch am Code...

    Und zwar möchte ich die Möglichkeit haben Tabs im Browser zu öffnen. Hierzu habe ich zwei Forms, eine mit dem Panel, auf welches der Browser gebunden wird (muss ja anscheinend bei CefSharp so sein, daher rührt teils auch mein Problem)
    Im zweiten Form befindet sich das TabControl Element, auf welches dann Form 1 eingebunden wird.

    Probleme die ich hier habe:
    Ich kann von Form2 nicht auf Form1 zugreifen. Es kommt immer eine Fehlermeldung, dass eine Objektinstanz nicht zugewiesen ist. Also die Null Exception.

    Zweites Problem: Ich möchte den Webseiten Titel in den Tabs haben. Jedoch müsste ich doch das über ein Ereignis prüfen, welches nachsieht ob die Website geladen hat oder? Jedoch komm ich an das Browserelement nicht so einfach heran, da es ja im Panel und im Tabcontroller eingebunden ist :)
    Ich weiß diese Fragen sind wahrscheinlich wahrlich Noob Fragen, hier bitte ich um Verzeihung! Aber ich möchte wirklich besser werden im Thema programmieren

    Vielen Dank schonmal!

    Ach ja, ohne Code gehts hier ja nicht, ich füge mal beide Forms als Code ein:

    Form1:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports CefSharp
    3. Imports CefSharp.WinForms
    4. Public Class Form1
    5. Public Property mettbrowser As ChromiumWebBrowser
    6. Public Async Function PrepareBrowserAsync() As Task
    7. 'BrowserCache anlegen, damit nicht immer erneut die Cookie Abfrage auftaucht
    8. Dim cachePath = IO.Path.Combine(Environment.CurrentDirectory, "cache")
    9. If Not IO.Directory.Exists(cachePath) Then
    10. IO.Directory.CreateDirectory(cachePath)
    11. End If
    12. 'Einstellungen für CEF-Umgebung festlegen. Session-Cookies aktivieren, Pfad für diese festlegen (per cachePath)
    13. Dim settings = New CefSettings() With {
    14. .PersistSessionCookies = True,
    15. .CachePath = cachePath
    16. }
    17. Cef.Initialize(settings)
    18. 'Browser im Panel füllen
    19. mettbrowser = New ChromiumWebBrowser("") With {
    20. .Dock = DockStyle.Fill
    21. }
    22. 'Funktion eine halbe Sekunde Asynchron warten lassen, damit das Laden der Adresse funktioniert
    23. Await Task.Delay(500)
    24. pnlWebbrowserContainer.Controls.Add(mettbrowser)
    25. End Function
    26. Public Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    27. If Cef.IsInitialized = False Then
    28. Await PrepareBrowserAsync()
    29. 'Laden der Standardwebsite bei CEF wird dies mit LoadURL gemacht
    30. Await mettbrowser.LoadUrlAsync("https://google.de")
    31. End If
    32. End Sub
    33. Public Sub mettbrowser_LoadingStateChanged()
    34. 'Sauberes schließen bei Beenden
    35. Public Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    36. Cef.Shutdown()
    37. End Sub
    38. '----------------------------------------------------------------------
    39. 'Buttons Programmieren
    40. Public Sub btnGoBack_Click(sender As Object, e As EventArgs) Handles btnGoBack.Click
    41. mettbrowser.Back
    42. End Sub
    43. Public Sub btnGoForward_Click(sender As Object, e As EventArgs)
    44. mettbrowser.Forward
    45. End Sub
    46. Public Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
    47. mettbrowser.Refresh()
    48. End Sub
    49. Public Sub btnDev_Click(sender As Object, e As EventArgs) Handles btnDev.Click
    50. mettbrowser.ShowDevTools
    51. End Sub
    52. Public Sub btnSource_Click(sender As Object, e As EventArgs) Handles btnSource.Click
    53. mettbrowser.ViewSource
    54. End Sub
    55. Public Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    56. Me.mettbrowser.Load(txtUrl.Text)
    57. End Sub
    58. 'KeyDown Event, bei Enter in der Searchbar
    59. Public Sub txtUrl_KeyDown(sender As Object, e As KeyEventArgs) Handles txtUrl.KeyDown
    60. If e.KeyCode = Keys.Enter Then
    61. mettbrowser.Load(txtUrl.Text)
    62. End If
    63. End Sub
    64. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    65. Call Form2.NewTab()
    66. End Sub
    67. '----------------------------------------------------------------------
    68. End Class


    Form2:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports CefSharp
    3. Imports CefSharp.WinForms
    4. Public Class Form2
    5. 'Verbindet TabControl von Form2 mit Form1
    6. Public Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Dim t As New TabPage
    8. Dim newtab As New Form1
    9. newtab.Show()
    10. newtab.TopLevel = False
    11. newtab.Dock = DockStyle.Fill
    12. t.Controls.Add(newtab)
    13. TabControl1.TabPages.Add(t)
    14. End Sub
    15. Public Sub NewTab()
    16. Dim t As New TabPage
    17. Dim newtab As New Form
    18. newtab.Show()
    19. newtab.TopLevel = False
    20. newtab.Dock = DockStyle.Fill
    21. t.Controls.Add(newtab)
    22. TabControl1.TabPages.Add(t)
    23. End Sub
    24. End Class
    Für dein Vorhaben benötigst du eine Form auf der das TabControl liegt. Wenn du einen neuen Tab öffnen willst erstellt du dir eine neue TabPage und eine neue Instanz deines BrowserControls dieses fügst du dann der TabPage hinzu und die TabPage dem TabControl. CefSharp dürfte vermutlich einen DocumentLoaded Event oder etwas in der Richtung bereitstellen mit dem du an den Titel der Website kommst.
    Hallo Fakiz,

    vielen Dank für die Antwort :)

    Genau so hatte ich mir das gedacht, das TabControl liegt aktuell auf Form2, ich habe es auch geschafft neue Tabs zu erstellen, jedoch waren diese Leer und alle Buttons, welche über Form1 gesetzt sind gehen dann in den "Null Exeption Error"

    Fraglich ist wie genau ich die neue Browserinstanz über die Form2 laden müsste oder ob ich den Code allgemein "teilweise" nochmal in Form2 rüber kopieren müsste

    Zwecks des Document Loading Events hatte ich auch schon etwas gesehen, aber irgendwie funktioniert der Zugriff aus Form2 nicht :|
    Die Tabs blieben dann trotzdem leer

    Edit:
    Ich habe das Sub in Form2 nochmal verändert:

    VB.NET-Quellcode

    1. Public Sub NewTab()
    2. Dim t As New TabPage
    3. Dim newtab As New Form1
    4. newtab.Show()
    5. newtab.TopLevel = False
    6. newtab.Dock = DockStyle.Fill
    7. t.Controls.Add(newtab)
    8. TabControl1.TabPages.Add(t)
    9. End Sub


    Also explizit die Zeile des NewTab als Form1
    Die 1 habe ich zu Testzwecken entfernt und versehentlich hier so mit reingepostet, es öffnet den neuen Tab und die Elemente von Form1 werden im neuen Tab geladen.
    Jedoch nicht das Browserelement, sowie die Buttons, folgende Fehlermeldung erscheint:
    (Bild im Dateianhang)

    Das Fenster schließt sich daraufhin und mir wird diese Zeile in VS angekreidet, habe ich jetzt hier beim Klick auf den Search Button

    Vielleicht hilft das ja etwas bei der Problemfindung weiter :)

    Ich danke schonmal ganz herzlich!
    Bilder
    • MettbrowserTabError.PNG

      24,55 kB, 684×272, 115 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Quasi“ ()

    benötigst du eine Form

    Das heißt Form2 wird nicht benötigt. In Form1 legst du dann den DocumentLoaded EventHandler an. Der muss dann allen neu erstellten Instanzen des CefSharp Controls zugewiesen werden. Bevor du dich verennst würde ich dir raten das ganze erst einmal mit einer TabPage, die du im Designer der Form1 erstellt, umzusetzen. Wenn alles mit einem Tab läuft würde ich mich an den Dynamischen Tabs versuchen.

    Edit:
    Ich hab dir mal ein Bild angehängt das zeigt wie dein Layout idealer weise im Moment aussehen sollte. In der Linken oberen Ecke kannst du meine Projektmappe sehen. Darunter kannst du das Eigenschaftsfenster sehen. Darüber kannst du unter anderem die Ereignisse die ein Steuerelement bereitstellt einsehen und Abonieren. Hierfür musst du mit der Maus den CefSharp browser auswählen und dann auf das Blitzsymbol klicken. Im Eigenschaftsfenster musst du dir dan den DocumentLoaded - Event suchen und doppelt anklicken.
    Bilder
    • FormLayout.png

      56,1 kB, 1.163×627, 107 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fakiz“ ()