AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-10236130

Matthew Pans's questions

Martin Hope
Matthew Pans
Asked: 2025-02-13 19:25:34 +0800 CST

.NET MAUI:如何设置自定义 Webview 渲染器的字体系列和字体大小

  • 5

我正在使用自定义 WebView 在 .NET MAUI 应用程序中显示 HTML 内容。我需要为 Webview 设置字体系列和字体大小。我已经实现了字体大小调整,它在 iPhone 上有效,但字体大小在 iPad 上不起作用。如何为自定义 Webview 设置字体系列和字体大小?下面,我添加了渲染器类代码。

渲染器类:

public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
    WKWebView _wkWebView;

    protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var config = new WKWebViewConfiguration();
            config.AllowsInlineMediaPlayback = true;
            _wkWebView = new WKWebView(Frame, config);
            //transparent background
            _wkWebView = new WKWebView(CGRect.Empty, config);
            _wkWebView.BackgroundColor = UIColor.Clear;
            _wkWebView.ScrollView.BackgroundColor = UIColor.Clear;
            _wkWebView.ScrollView.ScrollEnabled = false;
            _wkWebView.Opaque = false;
            _wkWebView.NavigationDelegate = new MyNavigationDelegate();
            SetNativeControl(_wkWebView);
            
        }
        //if (e.NewElement != null)
        //{
        //    Control.LoadHtmlString(Element.Url, null);   //use this code instead
        //    //Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
        //}
    }

    public class MyNavigationDelegate : WKNavigationDelegate
    {
        public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
        {
            string fontSize = "";
            if (Device.Idiom == TargetIdiom.Phone)
            {
                fontSize = "500%"; // > 100% shows larger than previous
            }
            else if (Device.Idiom == TargetIdiom.Tablet)
            {
                fontSize = "750%"; // > 100% shows larger than previous
            }

            string stringsss = String.Format(@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '{0}'", fontSize);
            WKJavascriptEvaluationResult handler = (NSObject result, NSError err) =>
            {
                if (err != null)
                {
                    System.Console.WriteLine(err);
                }
                if (result != null)
                {
                    System.Console.WriteLine(result);
                }
            };
            webView.EvaluateJavaScript(stringsss, handler);
            //base.DidFinishNavigation(webView, navigation);
        }

    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == "Url")
        {
            //string headerString = "<header><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0, user-scalable=no'><style>img{max-width:50%}</style></header>";
            ////string bodyString = "<html><body><h1>Xamarin.Forms</h1><p>Welcome to WebView.</p><video src='movie.ogg'controls='controls'></video></body></html>";
            //string finalHtml = headerString + Element.Url;
            //Control.LoadHtmlString(finalHtml, null);

            string finalHtml = Element.Url.Replace("width=\"640\"", "width=\"1000\"");
            Control.LoadHtmlString(finalHtml, null);
            //Control.LoadHtmlString(Element.Url, null);
        }
    }
}
webview
  • 1 个回答
  • 48 Views
Martin Hope
Matthew Pans
Asked: 2025-01-20 15:06:31 +0800 CST

collectionview 的 SelectionChangedCommand 中 selecteditem 的问题

  • 7

我已经为 collectionview 添加了命令SelectionChangedCommand。SelectedItem

<CollectionView
        Margin="0,10,0,0"
        BackgroundColor="Transparent"
        IsVisible="{Binding Visibility}"
        ItemsSource="{Binding ImageItems}"
        ItemsLayout="VerticalGrid, 2"
        SelectionMode="Single"
        SelectionChangedCommand="{Binding ImageItemTappedCommand}"
        SelectedItem="{Binding LastImageTappedItem, Mode=TwoWay}"
        HeightRequest="{Binding ImageHeight}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <StackLayout BackgroundColor="{Binding ImageBGColor}">

ImageItemTapped命令:

public NameMatchViewModel() {
    ImageItemTappedCommand = new Command((obj) = >{
        try {
            //reset the bg color 
            foreach(var item in ImageItems) {
                item.ImageBGColor = Colors.White;
            }
            NameMatchList imageList = obj as NameMatchList;
            if (imageList != null) {
                Debug.WriteLine("**not null**");
            }
            else {
                Debug.WriteLine("**null**");
            }
            int index = ImageItems.IndexOf(imageList);
            imageList.ImageBGColor = Color.FromArgb("#0091da");
            //Storing name and imageurl to local db
            if (Utility.IsInternet()) {
                Preferences.Default.Set("NameMatchImageList_Image", imageList.imageUrl);
            }
            else {
                Preferences.Default.Set("NameMatchImageList_Image", imageList.FullImageUrl);
            }
            Preferences.Default.Set("NameMatchImageList_Name", imageList.name);
            Preferences.Default.Set("ImageItem", imageList);
            isImageSelected = true;
            if (isImageSelected && isNameSelected) {
                //If both image and name selected by player startes checking the matching
                StartNameMatchCheck(imageList);
            }
        }
        catch(Exception imagetapEx) {
            Debug.WriteLine("imagetapEx:>>" + imagetapEx);
        }
    });
}

但是当我尝试获取 selecteditem 值时,我得到的是 null。对于上述代码,我得到以下异常:

以下行除外:

imageList.ImageBGColor = Color.FromArgb("#0091da");
**null**
12:30:36:070    [0:] imagetapEx:>>System.NullReferenceException: Object reference not set to an instance of an object.
12:30:36:070       at MyProjectName.Model.NameMatchViewModel.<.ctor>b__98_0(Object obj) in E:\My Projects\MAUI\MyProjectName-app-maui\MyProjectName\Model\NameMatchViewModel.cs:line 390

我如何获取选定项目的值?

c#
  • 1 个回答
  • 43 Views
Martin Hope
Matthew Pans
Asked: 2025-01-19 20:16:20 +0800 CST

Plugin.InAppBilling:确认 Android 购买

  • 6

我Plugin.InAppBilling在我的 MAUI 应用程序中使用它进行订阅。对于 Android 部分,我需要在成功购买后进行确认。

选项 1:ConsumePurchaseAsync

if (DeviceInfo.Platform == DevicePlatform.Android)
{
    var consumed = await CrossInAppBilling.Current.ConsumePurchaseAsync(productId, purchase.PurchaseToken);
    if (!consumed)
    {
        Debug.WriteLine("Purchase consumption/acknowledgment failed");
        return;
    }
    Debug.WriteLine("Purchase acknowledged successfully");
}

但我遇到了以下异常:

16:05:10:848    [0:] purchaseEx:>>Plugin.InAppBilling.InAppBillingPurchaseException: Unable to process purchase.
16:05:10:848       at Plugin.InAppBilling.InAppBillingImplementation.ParseBillingResult(BillingResult result, Boolean ignoreInvalidProducts)
16:05:10:848       at Plugin.InAppBilling.InAppBillingImplementation.ConsumePurchaseAsync(String productId, String transactionIdentifier)
16:05:10:848       at MyProjectName.Pages.ListPlansPage.PlanClicked(Object sender, EventArgs e) in E:\My Projects\MAUI
16:05:10:848    eedhelp-app-maui\MyProjectName\Pages\Subscription\ListPlansPage.xaml.cs:line 371
16:05:10:909    The thread 25 has exited with code 0 (0x0).

以下行存在异常:

var consumed = await CrossInAppBilling.Current.ConsumePurchaseAsync(productId, purchase.PurchaseToken);

选项 2:DependencyService

创建了一个接口:IPurchaseAcknowledgment

public interface IPurchaseAcknowledgment
{
    Task<bool> AcknowledgePurchaseAsync(string purchaseToken);
}

实施IPurchaseAcknowledgment日期MainActivity:

public class MainActivity : MauiAppCompatActivity, IPurchaseAcknowledgment
{
    /// <summary>
    /// Acknowledge purchase using Google Play BillingClient
    /// </summary>
    public async Task<bool> AcknowledgePurchaseAsync(string purchaseToken)
    {
        var billingClient = BillingClient.NewBuilder(Android.App.Application.Context)
            .SetListener(new PurchaseUpdateListener()) // You can implement your own listener if needed
            .EnablePendingPurchases()
            .Build();

        // Connect to the BillingClient
        var billingConnectionTaskCompletionSource = new TaskCompletionSource<BillingResult>();
        billingClient.StartConnection(new BillingClientStateListener(
            onBillingSetupFinished: billingResult => billingConnectionTaskCompletionSource.SetResult(billingResult),
            onBillingServiceDisconnected: () => billingConnectionTaskCompletionSource.SetException(new System.Exception("Billing service disconnected"))
        ));

        var connectionResult = await billingConnectionTaskCompletionSource.Task;
        if (connectionResult.ResponseCode != BillingResponseCode.Ok)
        {
            return false; // Connection failed
        }

        // Acknowledge the purchase
        var acknowledgeParams = AcknowledgePurchaseParams.NewBuilder()
            .SetPurchaseToken(purchaseToken)
            .Build();

        var acknowledgeTaskCompletionSource = new TaskCompletionSource<BillingResult>();
        billingClient.AcknowledgePurchase(acknowledgeParams, new AcknowledgePurchaseResponseListener(
            result => acknowledgeTaskCompletionSource.SetResult(result)
        ));

        var acknowledgeResult = await acknowledgeTaskCompletionSource.Task;

        // End connection
        billingClient.EndConnection();

        return acknowledgeResult.ResponseCode == BillingResponseCode.Ok;
    }

    /// <summary>
    /// Listener for purchase updates (can be extended if required)
    /// </summary>
    private class PurchaseUpdateListener : Java.Lang.Object, IPurchasesUpdatedListener
    {
        public void OnPurchasesUpdated(BillingResult billingResult, IList<Purchase> purchases)
        {
            // Handle purchase updates here if needed
        }
    }

    /// <summary>
    /// Listener for billing client state
    /// </summary>
    private class BillingClientStateListener : Java.Lang.Object, IBillingClientStateListener
    {
        private readonly System.Action<BillingResult> onBillingSetupFinished;
        private readonly System.Action onBillingServiceDisconnected;

        public BillingClientStateListener(System.Action<BillingResult> onBillingSetupFinished, System.Action onBillingServiceDisconnected)
        {
            this.onBillingSetupFinished = onBillingSetupFinished;
            this.onBillingServiceDisconnected = onBillingServiceDisconnected;
        }

        public void OnBillingSetupFinished(BillingResult billingResult)
        {
            onBillingSetupFinished?.Invoke(billingResult);
        }

        public void OnBillingServiceDisconnected()
        {
            onBillingServiceDisconnected?.Invoke();
        }
    }

    /// <summary>
    /// Listener for acknowledge purchase response
    /// </summary>
    private class AcknowledgePurchaseResponseListener : Java.Lang.Object, IAcknowledgePurchaseResponseListener
    {
        private readonly System.Action<BillingResult> onAcknowledgeResponse;

        public AcknowledgePurchaseResponseListener(System.Action<BillingResult> onAcknowledgeResponse)
        {
            this.onAcknowledgeResponse = onAcknowledgeResponse;
        }

        public void OnAcknowledgePurchaseResponse(BillingResult billingResult)
        {
            onAcknowledgeResponse?.Invoke(billingResult);
        }
    }
}

购买计划后最终结果:

if (DeviceInfo.Platform == DevicePlatform.Android)
{
    var acknowledgmentService = DependencyService.Get<IPurchaseAcknowledgment>();
    var acknowledged = await acknowledgmentService.AcknowledgePurchaseAsync(purchase.PurchaseToken);

    if (!acknowledged)
    {
        Debug.WriteLine("Purchase acknowledgment failed");
        return;
    }
    Debug.WriteLine("Purchase acknowledged successfully");
}

但出现以下异常:

16:23:24:835    [0:] exception:>>System.NullReferenceException: Object reference not set to an instance of an object.
16:23:24:835       at MyProjectName.Pages.ListPlansPage.PlanClicked(Object sender, EventArgs e) in E:\My Projects\MAUI
16:23:24:835    eedhelp-app-maui\MyProjectName\Pages\Subscription\ListPlansPage.xaml.cs:line 383

以下行存在异常:

var acknowledged = await acknowledgmentService.AcknowledgePurchaseAsync(purchase.PurchaseToken);

还有其他解决办法吗?

更新

我尝试如下:

var consumed = await CrossInAppBilling.Current.ConsumePurchaseAsync(purchase.ProductId, purchase.TransactionIdentifier);

但出现以下异常:

12:43:02:766    [0:] purchaseEx:>>Plugin.InAppBilling.InAppBillingPurchaseException: Unable to process purchase.
12:43:02:766       at Plugin.InAppBilling.InAppBillingImplementation.ParseBillingResult(BillingResult result, Boolean ignoreInvalidProducts)
12:43:02:766       at Plugin.InAppBilling.InAppBillingImplementation.ConsumePurchaseAsync(String productId, String transactionIdentifier)
12:43:02:766       at MyProjectName.Pages.ListPlansPage.PlanClicked(Object sender, EventArgs e) in E:\My Projects\MAUI
12:43:02:766    eedhelp-app-maui\MyProjectName\Pages\Subscription\ListPlansPage.xaml.cs:line 372
maui
  • 1 个回答
  • 44 Views
Martin Hope
Matthew Pans
Asked: 2025-01-08 21:22:11 +0800 CST

MAUI:如何在发布模式下查看调试语句

  • 5

我正在尝试在发布模式下打印调试器语句来解决一个问题。

为此我做了以下改变:

1 在.csproj 文件上添加了 DebugType、DebugSymbols、Debuggable 和 AndroidEnableDeveloperInstrumentation。

<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-android|AnyCPU'">
  <ApplicationId>com.companyname.appname</ApplicationId>
  <AndroidPackageFormat>apk</AndroidPackageFormat>
  <ApplicationTitle>appname</ApplicationTitle>
  <DebugType>portable</DebugType>
  <DebugSymbols>true</DebugSymbols>
  <Debuggable>true</Debuggable>
  <AndroidEnableDeveloperInstrumentation>true</AndroidEnableDeveloperInstrumentation>
</PropertyGroup>

2 在应用程序下的android manifext文件中添加android:debuggable="true"。

3 在MAUIProgram.cs中添加以下代码。

builder.Logging.AddConsole(options =>
{
    options.IncludeScopes = true;
});
builder.Logging.SetMinimumLevel(LogLevel.Debug);
  1. 在 App.xaml.cs 下添加以下代码。

    使用 Microsoft.Extensions.Logging;

    公共部分类 App:应用程序 { 公共 App(ILogger logger) { InitializeComponent();

         logger.LogInformation("App started in production mode.");
         logger.LogError("An error occurred.");
     }
    

    }

  2. 在项目属性下启用开发人员工具以进行发布模式。

在此处输入图片描述

但是当我在发布模式下运行时,我看到的是以下屏幕。

在此处输入图片描述

在发布模式下查看调试器语句还有其他变化吗?

maui
  • 1 个回答
  • 34 Views
Martin Hope
Matthew Pans
Asked: 2024-02-14 19:39:34 +0800 CST

MAUI:电源键+音量键点击事件

  • 5

同时点击电源按钮和音量按钮时是否可以在移动应用程序上触发事件?

当用户在移动设备上触发任意密钥组合时,我需要在用户界面上显示一个秘密选项(标签)。

有什么选择吗?我只提到电源按钮+音量按钮,如果有其他组合可用,请建议?

maui
  • 1 个回答
  • 19 Views
Martin Hope
Matthew Pans
Asked: 2023-08-17 23:46:20 +0800 CST

部署目标 Android 版本 12 应用程序时出现错误

  • 5

将目标 Android 版本升级到 12 后,我无法部署我的应用程序,并收到以下错误:

错误ADB0010:Mono.AndroidTools.InstallFailedException:意外的安装输出:失败[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:installPackageLI期间解析失败:/data/app/vmdl1678539237.tmp/base.apk(位于二进制XML文件第23行):crc64045f0433dcf30634.FirebaseNotificationService:目标荷兰国际集团S+ (版本 31 及更高版本)要求在存在意图过滤器时定义 android:exported 的显式值]

这是我的 Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="testapp.com" android:installLocation="preferExternal" android:versionCode="31" android:versionName="4.1">
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="31" />
    <application android:label="Test App" android:icon="@drawable/icon" android:usesCleartextTraffic="true" android:allowBackup="false">
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

我该如何解决这个问题?请提出一个解决方案。

xamarin.forms
  • 1 个回答
  • 16 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve