gpt4 book ai didi

javascript - 在 Xamarin.Forms 上使用 Javascript 打开浏览器窗口

转载 作者:行者123 更新时间:2023-12-04 10:36:36 27 4
gpt4 key购买 nike

我有一个 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 链接来单击事件以打开特定网页。代码是:
  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.Essentials 运行:
 await Browser.OpenAsync(new Uri(buylink), BrowserLaunchMode.SystemPreferred); // Open url in-app browser for iOS & Android- native in UWP

但是,我的 Xamarin.Forms 应用程序使用 Uno 平台投影到 WebAssembly 代码,因此此代码块未运行。因此。我安装 Jint到 Xamarin.Forms 应用程序。此 catch block 打印到浏览器控制台的链接,但在 API 引用中没有 window.open 函数跟踪:
 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(); ");
}
}

如何通过 Javascript 表单 Xamarin.Forms C# 代码在 WASM 上打开 WebBrowser 页面?谢谢。

最佳答案

2件事:

1.使用浏览器!

在 Wasm 上,您在 webassembly 环境中运行,该环境在 中运行。 javascript 虚拟机(这并不完全准确,但对我来说足够接近)。这意味着您可以直接调用运行环境(浏览器)的javascript。

调用原生 javascript...

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

In your case, since you want to open a browser window, it's required to use this approach, because Jint can't access anything from the browser itself.



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 Forms 不够熟悉,不知道是否有等价物。

关于javascript - 在 Xamarin.Forms 上使用 Javascript 打开浏览器窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60152725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com