在Maui中执行JavaScript语句

有这样一个场景,软件检测到了一些文件,要从文件名中提取版号,实践生产中,文件名没有规律,根本无从知道,文件名中哪些数字代表的是版号,需要使用者编写javascript函数,自己从文件名中提取版号,实际文件名有可能是这样:20230405KJRBA01C.pdf,111.ps,2.ps,4106A01.pdf等等。

先建一个ClearScriptDemoApp,从nuget获取Microsoft.ClearScript.V8包,和Midcrosoft.ClearScript.V8.Native.win-64包,没有后面这个包,在windows下无法执行。

在项目中建一个viewmodels文件夹,建一个ParseFileNameViewModel.cs文件, 文件如下,

private string codeText  ------>给用户写javascript代码

private string javascriptFunc ------->我们自己定义在javascript语言中使用的函数名getPageID(filename)

 private string javascripEnd--------->给函数加末尾

完整代码:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.ClearScript.V8;

namespace ClearScriptDemoApp.ViewModels
{
    partial class ParseFileNameViewModel : ObservableObject
    {
        [ObservableProperty]
        private string codeText;

        [ObservableProperty]
        private string javascriptFunc;
        [ObservableProperty]
        private string javascripEnd;

        [ObservableProperty]
        private string testFileName;

        [ObservableProperty]
        private string result;

        public ParseFileNameViewModel()
        {
            JavascriptFunc = @"function getPageID(filename) { ";
            javascripEnd = @" }";
            TestFileName = "20230405KJRBA01C.pdf";
        }

        [RelayCommand]
        async Task GetPageNum(string filename)
        {
            string pageNum = "";

            using (var engine = new V8ScriptEngine())
            {
                try
                {
                    engine.Execute(JavascriptFunc + CodeText + JavascripEnd);
                    pageNum = engine.Script.getPageID(filename).ToString();
                }
                catch (Exception ex)
                {
                    pageNum = "语法错误,请检查代码。";
                }
                
            }
            if(!pageNum.Contains("undefined"))
            {
                Result = await Task.FromResult(pageNum);
            }
            
        }
    }
}

感觉clearscript非常好用,如此简单就满足了我的需求。

在项目中添加views文件夹,生成AnalysePage.xaml文件,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:viewmodel="clr-namespace:ClearScriptDemoApp.ViewModels"             
             x:Class="ClearScriptDemoApp.Views.AnalysePage"
             Title="AnalysePage">   
    <ContentPage.BindingContext>
        <viewmodel:ParseFileNameViewModel/>
    </ContentPage.BindingContext>
    <Grid RowDefinitions="auto,*,0.1*,auto" Margin="5" RowSpacing="0">
        <Label Text="{Binding JavascriptFunc}" BackgroundColor="LightGray" Padding="5"/>
        <Editor Text="{Binding CodeText}" IsSpellCheckEnabled="False" IsTextPredictionEnabled="False" Grid.Row="1"/>
        <Label Text="{Binding JavascripEnd}" Grid.Row="2" VerticalOptions="Start" HorizontalOptions="Start" BackgroundColor="LightGray" Padding="5"/>
        <HorizontalStackLayout Grid.Row="3">
            <Label Text="测试结果:" VerticalOptions="Center"/>
            <Label Text="{Binding Result}" VerticalOptions="Center" MinimumWidthRequest="50"/>
            <Label Text="文件名:" VerticalOptions="Center"/>
            <Entry Placeholder="测试文件名" WidthRequest="300" VerticalOptions="Center" Text="{Binding TestFileName}"/>
            <Button Text="测试" VerticalOptions="Center" Command="{Binding GetPageNumCommand}" CommandParameter="{Binding TestFileName}"/>
        </HorizontalStackLayout>
    </Grid>
</ContentPage>

App界面

 在里面写上代码试试

 完全正确,正是我们需要的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 .NET MAUI ,您可以使用 Xamarin.Forms 的控件和事件处理程序来实现此功能。您可以使用 XAML 定义 UI 控件,然后在代码处理遥控器按钮的点击事件,并移动光标的位置。 以下是一个示例代码,演示如何在 .NET MAUI 实现此功能: 在 XAML 文件,您可以定义一个 Grid 和一个 Label 控件,用于显示光标: ```xml <Grid> <Label x:Name="cursor" Text="●" FontSize="40" TextColor="Red" /> </Grid> ``` 在代码,您可以处理遥控器按钮的点击事件,并移动光标的位置。在这个示例,我们使用了四个 Button 控件来模拟遥控器的上下左右按钮: ```csharp public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); // 添加按钮的点击事件处理程序 btnUp.Clicked += BtnUp_Clicked; btnDown.Clicked += BtnDown_Clicked; btnLeft.Clicked += BtnLeft_Clicked; btnRight.Clicked += BtnRight_Clicked; } private void BtnUp_Clicked(object sender, EventArgs e) { // 向上移动光标 cursor.TranslationY -= 10; } private void BtnDown_Clicked(object sender, EventArgs e) { // 向下移动光标 cursor.TranslationY += 10; } private void BtnLeft_Clicked(object sender, EventArgs e) { // 向左移动光标 cursor.TranslationX -= 10; } private void BtnRight_Clicked(object sender, EventArgs e) { // 向右移动光标 cursor.TranslationX += 10; } } ``` 请注意,这只是一个简单的示例代码,您需要根据实际情况进行调整和修改。如果您遇到了问题或需要更多帮助,请提供更多信息,我会尽力协助您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值