Откройте окно браузера с Javascript на Xamarin.Forms - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть приложение Xamarin.Forms. Она включает в себя такую ​​кнопку:

 <Button x:Name="Buy_Button" Text="Satın Al" FontAttributes="Bold" TextColor="#e2e2e2" BackgroundColor="#2A52BE" FontFamily="Segoe UI" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1"  CornerRadius="5"  VerticalOptions="Start" HorizontalOptions="Center" FontSize="15.667" Grid.Row="0" Margin="0,10,10,0"  Clicked="Buy_Button_ClickedAsync" CommandParameter="{Binding  Buy_URL}" />

Я отправляю URL-ссылку, чтобы щелкнуть событие для открытия указанной c веб-страницы. Код:

  private async void Buy_Button_ClickedAsync(object sender, EventArgs e)
    {
        Button btn = (Button)sender; // Coming button from click event handler.
        var buylink = btn.CommandParameter.ToString(); // Get the CommandParameter.
                                                       //  await DisplayAlert("Satın alma linki", buylink, "Anladım"); // Show the link.
        try // Uwp & iOS & Android
        {
            await Browser.OpenAsync(new Uri(buylink), BrowserLaunchMode.SystemPreferred); // Open url in-app browser for iOS & Android- native in UWP
        }
        catch (NotImplementedInReferenceAssemblyException ex) //Wasm falls here because lack of Xamarin.Essentials.
        {
            // await DisplayAlert("Hata", ex.Message, "Anladım"); // Show the info about exception.

            // Jint - nt is a Javascript interpreter for .NET which provides full ECMA 5.1 compliance and can run on any .NET platform. 
            //Because it doesn't generate any .NET bytecode nor use the DLR it runs relatively small scripts faster. 
            //https://github.com/sebastienros/jint

            var engine = new Engine();
            engine.SetValue("log", new Action<object>(Console.WriteLine));

            engine.Execute(@"function openurl() { log('" + buylink + "'); }; openurl(); ");
        }
    }

В UWP, Xamarin. iOS и Xamarin. Android этот код выполняется через Xamarin.Esssentials:

 await Browser.OpenAsync(new Uri(buylink), BrowserLaunchMode.SystemPreferred); // Open url in-app browser for iOS & Android- native in UWP

Однако мое приложение Xamarin.Forms спроектировано для кода WebAssembly с Uno Platform, поэтому этот блок кода не работает. В результате. Я устанавливаю Jint в приложение Xamarin.Forms. Этот блок catch печатает ссылку на консоль браузера, но не отслеживает функцию window.open в справочнике по API:

 catch (NotImplementedInReferenceAssemblyException ex) //Wasm falls here because lack of Xamarin.Essentials.
            {
                // await DisplayAlert("Hata", ex.Message, "Anladım"); // Show the info about exception.

                       // Jint - nt is a Javascript interpreter for .NET which provides full ECMA 5.1 compliance and can run on any .NET platform. 
                //Because it doesn't generate any .NET bytecode nor use the DLR it runs relatively small scripts faster. 
                //https://github.com/sebastienros/jint

                var engine = new Engine();
                engine.SetValue("log", new Action<object>(Console.WriteLine));

                engine.Execute(@"function openurl() { log('" + buylink + "'); }; openurl(); ");
            }
        }

Как открыть страницу WebBrowser в WASM с помощью Javascript формы Xamarin.Forms C# code ? Спасибо.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

2 вещи:

1. Используйте браузер!

В Wasm вы работаете в среде webassembly , которая работает в виртуальной машине javascript (это не совсем точно, но достаточно близко для моей точки зрения). Это означает, что вы можете напрямую вызывать javascript работающей среды (браузера).

Выполнение вызова native javascript ...

WebAssemblyRuntime
    .InvokeJS("(function(){location.href=\"https://www.wikipedia.com/\";})();");

В вашем случае, поскольку вы хотите открыть окно браузера , необходимо использовать этот подход, поскольку Jint не может получить доступ к чему-либо из самого браузера.

2. Вы все равно можете вызвать Jint (но не открывать новое окно)

Если вы все еще хотите вызывать код с помощью Jint (потому что вы можете !!), вам нужно исключить сборку Jint.dll из ссылки обработать. Возможно, потому что он использует отражение для работы. Опять же, не будет работать, чтобы открыть окно, как вы спрашиваете , но если вам нужно позвонить Jint по любой другой причине, оно будет работать как на других платформах!

Добавьте это к вашему LinkerConfig.xml (в проекте Wasm):

  <assembly fullname="Jint" />

Также ... Вы дали мне идею, и я сделал что-то классное с Jint ...

Я положил туда все решение: https://github.com/carldebilly/TestJint

Работает даже на Wasm: enter image description here

Интересный код: https://github.com/carldebilly/TestJint/blob/master/TestJint/TestJint.Shared/MainPage.xaml.cs#L18 -L40

        private void BtnClick(object sender, RoutedEventArgs e)
        {
            void Log(object o)
            {
                output.Text = o?.ToString() ?? "<null>";
            }

            var engine = new Engine()
                    .SetValue("log", new Action<object>(Log));

            engine.Execute(@"
      function hello() { 
        log('Hello World ' + new Date());
      };

      hello();
    ");

#if __WASM__
            output2.Text =
                WebAssemblyRuntime.InvokeJS("(function(){return 'Hello World ' + new Date();})();");
#else
            output2.Text = "Not supported on this platform.";
#endif
        }

Заключительное примечание

Вкл. UWP / WinUI XAML , вы можете непосредственно вставить <Hyperlink /> в свой XAML. Я недостаточно знаком с формами Xamarin, чтобы знать, есть ли эквивалент.

0 голосов
/ 05 марта 2020

Я использую Device.OpenUri, и он работает в WASM с Xamarin.Forms

Device.OpenUri(new Uri("https://www.bing.com"));
...