C# to VB.NET Umwandlung handler = Function(sender, args)

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    C# to VB.NET Umwandlung handler = Function(sender, args)

    huhu liebe Gemeinde,

    ich habe ein C# Projekt von einem externen Browserprojekt, der soweit auch prima funktioniert.
    ICh habe alles in VB.NET umwandeln können, bis auf eine kleine Stelle vom C# Code:

    C#-Quellcode

    1. public static Task LoadPageAsync(IWebBrowser browser, string address = null)
    2. {
    3. //If using .Net 4.6 then use TaskCreationOptions.RunContinuationsAsynchronously
    4. //and switch to tcs.TrySetResult below - no need for the custom extension method
    5. var tcs = new TaskCompletionSource<bool>();
    6. EventHandler<LoadingStateChangedEventArgs> handler = null;
    7. handler = (sender, args) =>
    8. {
    9. //Wait for while page to finish loading not just the first frame
    10. if (!args.IsLoading)
    11. {
    12. browser.LoadingStateChanged -= handler;
    13. //This is required when using a standard TaskCompletionSource
    14. //Extension method found in the CefSharp.Internals namespace
    15. tcs.TrySetResultAsync(true);
    16. }
    17. };
    18. browser.LoadingStateChanged += handler;
    19. if (!string.IsNullOrEmpty(address))
    20. {
    21. browser.Load(address);
    22. }
    23. return tcs.Task;
    24. }



    Die einzigen Stellen, die in der VB.NET Umwandlung angekreidet werden, sind folgende Zeilen:

    C#-Quellcode

    1. browser.LoadingStateChanged += handler;
    2. ....
    3. browser.LoadingStateChanged += handler;


    Die Umwandlung in VB.NET spuckt folgendes aus:

    VB.NET-Quellcode

    1. Public Shared Function LoadPageAsync(browser As IWebBrowser, Optional address As String = Nothing) As Task
    2. Dim tcs = New TaskCompletionSource(Of Boolean)()
    3. Dim handler As EventHandler(Of LoadingStateChangedEventArgs) = Nothing
    4. handler = Function(sender, args)
    5. If Not args.IsLoading Then
    6. browser.LoadingStateChanged -= handler
    7. tcs.TrySetResultAsync(True)
    8. End If
    9. End Function
    10. browser.LoadingStateChanged += handler
    11. If Not String.IsNullOrEmpty(address) Then
    12. browser.Load(address)
    13. End If
    14. Return tcs.Task
    15. End Function


    Hier werden browser.LoadingStateChanged += handler als Fehlermeldung angezeigt. Hat jemand vielleicht eine Idee, wie man das richtig formulieren kann?

    Vielen Dank! :)
    @Semiconductor So was:

    VB.NET-Quellcode

    1. Private Sub handler(sender As Object, e As EventArgsX) Handles browser.LoadingStateChanged
    2. End Sub
    oder

    VB.NET-Quellcode

    1. AddHandler browser.LoadingStateChanged, AddressOf handler
    2. RemoveHandler Button1.Click, AddressOf Button1_Click

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für deine Hilfe Rod,

    ich habs mal versucht, zu ergänzen, jedoch spuckt er bei beiden Versionen Fehler raus. Beim ersten kreidet er EventArgsX und LoadingStateChanged und beim zweiten nur das handler :/Das wundert mich.

    In der C# Version wird die obige Prozedur folgendermaßen aufgerufen:

    C#-Quellcode

    1. await LoadPageAsync(browser);

    Semiconductor schrieb:

    EventArgsX
    Da müssen natürlich die richtigen EventArgs stehen, in Deinem Post kommen keine vor und meine Glaskugel, na Du weißt schon.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    das AddressOf brauchst du nicht, da es sich bereits um einen Delegaten handelt:

    VB.NET-Quellcode

    1. AddHandler browser.LoadingStateChanged, handler


    Damit Handles funktioniert, bräuchtest du ein "Feld" (es wird zu einer Eigenschaft umgewandelt) außerhalb der Methode, das mit WithEvents markiert wurde.

    EventArgsX wären LoadingStateChangedEventArgs. Die standen schon da. ;)

    Viele Grüße
    ~blaze~