Xamarin.forms 共享在IOS或it上无法正常工作';显示弹出共享窗口的速度非常慢

Xamarin.forms 共享在IOS或it上无法正常工作';显示弹出共享窗口的速度非常慢,xamarin.forms,xamarin.ios,xamarin.essentials,Xamarin.forms,Xamarin.ios,Xamarin.essentials,我正在使用Xamarin表单开发一个移动应用程序,我面临着一个在Android上正常工作但在IOS上无法正常工作的问题,我有一个共享按钮,可以调用工作平台的内置共享,传递标题和uri,但是在IOS上,这个功能似乎没有按预期工作,我不知道它是否运行缓慢或有其他问题,因此,您必须多次点击共享图标才能显示共享弹出窗口(同样,这在Android上工作得非常好) 请告知, 代码如下: <StackLayout Grid.Column="2" Grid.ColumnSpan="2" Spacing="

我正在使用Xamarin表单开发一个移动应用程序,我面临着一个在Android上正常工作但在IOS上无法正常工作的问题,我有一个共享按钮,可以调用工作平台的内置共享,传递标题和uri,但是在IOS上,这个功能似乎没有按预期工作,我不知道它是否运行缓慢或有其他问题,因此,您必须多次点击共享图标才能显示共享弹出窗口(同样,这在Android上工作得非常好)

请告知, 代码如下:

<StackLayout Grid.Column="2" Grid.ColumnSpan="2" Spacing="0" Margin="0,5,13,0">
   <StackLayout.GestureRecognizers>
      <TapGestureRecognizer Tapped="ImageButton_Clicked"/>
   </StackLayout.GestureRecognizers>
   <Image Source="export" HeightRequest="27" WidthRequest="20" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,0,0"/>
</StackLayout>
<StackLayout Grid.Column="2" Grid.ColumnSpan="2" Spacing="0" Margin="0,5,13,0">
   <StackLayout.GestureRecognizers>
      <TapGestureRecognizer Tapped="ImageButton_Clicked"/>
   </StackLayout.GestureRecognizers>
   <Image Source="export" HeightRequest="27" WidthRequest="20" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,0,0"/>
</StackLayout>
除了我前面的问题之外,我将分享整个xaml代码跳跃,这可能会给出一个清晰的视图:

Xaml代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             xmlns:Helpers="clr-namespace:StandardsView.Helper"
             xmlns:telerikDataControls="clr-namespace:Telerik.XamarinForms.DataControls;assembly=Telerik.XamarinForms.DataControls"
             xmlns:telerikListView="clr-namespace:Telerik.XamarinForms.DataControls.ListView;assembly=Telerik.XamarinForms.DataControls"
             xmlns:local="clr-namespace:StandardsView.Views"
             xmlns:telerikPrimitives="clr-namespace:Telerik.XamarinForms.Primitives;assembly=Telerik.XamarinForms.Primitives"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="StandardsView.Views.PreviewStandard"
             x:Name="parent"
             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             ios:Page.UseSafeArea="False"
             NavigationPage.HasNavigationBar="False"
             BackgroundImageSource="{Binding AppModel.BackgroundImage}"
             IsEnabled="{Binding AppModel.IsBusy, Converter={Helpers:InverseBoolConverter}}">
    <Grid RowSpacing="0" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <telerikDataControls:RadListView x:Name="listView" Margin="10,0,0,0" SelectionMode="None" ItemsSource="{Binding AppModel.Benchmarks}"  HeaderTemplate="{StaticResource ListHeaderTemplate}" FooterTemplate="{StaticResource ListFooterTemplate}">
            <telerikDataControls:RadListView.ItemStyle>
                <telerikListView:ListViewItemStyle BackgroundColor="Transparent" BorderLocation="None" BorderWidth="0" BorderColor="Transparent" />
            </telerikDataControls:RadListView.ItemStyle>
            <telerikDataControls:RadListView.SelectedItemStyle>
                <telerikListView:ListViewItemStyle BackgroundColor="Transparent" />
            </telerikDataControls:RadListView.SelectedItemStyle>
            <telerikDataControls:RadListView.ItemTemplate>
                <DataTemplate>
                    <telerikListView:ListViewTemplateCell>
                        <telerikListView:ListViewTemplateCell.View>
                            <StackLayout Padding="0" Spacing="0" BackgroundColor="Transparent" Margin="0,0,0,10">
                                <telerikPrimitives:RadBorder CornerRadius="15, 15, 0, 0" Padding="0" Margin="0,0,12,0">
                                    <telerikPrimitives:RadBorder.Triggers>
                                        <DataTrigger TargetType="telerikPrimitives:RadBorder" Binding="{Binding ResourceCount}" Value="0">
                                            <Setter Property="CornerRadius" Value="15"/>
                                        </DataTrigger>
                                    </telerikPrimitives:RadBorder.Triggers>
                                    <Grid BackgroundColor="White">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="19"/>
                                            <ColumnDefinition Width="*"/>
                                            <ColumnDefinition Width="60"/>
                                            <ColumnDefinition Width="10"/>
                                        </Grid.ColumnDefinitions>
                                        <StackLayout Grid.Column="2" Grid.ColumnSpan="2" Spacing="0" Margin="0,5,13,0">
                                            <StackLayout.GestureRecognizers>
                                                <TapGestureRecognizer Command="{Binding ShareCommand}" />
                                            </StackLayout.GestureRecognizers>
                                            <Image Source="export" HeightRequest="27" WidthRequest="20" VerticalOptions="Center" HorizontalOptions="End" />
                                        </StackLayout>
                                        <StackLayout Grid.Column="1" Grid.ColumnSpan="2" Padding="0,0,0,10">
                                            <Grid Margin="0">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="130"/>
                                                    <ColumnDefinition Width="*"/>
                                                </Grid.ColumnDefinitions>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <BoxView BackgroundColor="{StaticResource CPALMS_BlueGreen}" CornerRadius="0,0,5,5" HeightRequest="22" WidthRequest="130"/>
                                                <Label Text="{Binding Code}" Style="{StaticResource BrowseItemTitle}" />
                                            </Grid>
                                            <Label MinimumHeightRequest="50" Style="{StaticResource BrowseItemDescription16}" Text="{Binding Description}" Margin="0,7,0,7" />
                                            <StackLayout>
                                                <StackLayout.Triggers>
                                                    <DataTrigger TargetType="StackLayout" Binding="{Binding Remarks}" Value="">
                                                        <Setter Property="IsVisible" Value="False"/>
                                                    </DataTrigger>
                                                </StackLayout.Triggers>
                                                <BoxView HeightRequest="1" BackgroundColor="{StaticResource CPALMS_BlueGreen}" ></BoxView>
                                                <Label Style="{StaticResource StdClarificationsTitleLabel}" Text="Clarifications" />
                                                <Label Style="{StaticResource StdClarificationsLabel}" Text="{Binding Remarks}" />
                                            </StackLayout>
                                            <BoxView HeightRequest="1" BackgroundColor="{StaticResource CPALMS_BlueGreen}" ></BoxView>
                                            <Label Style="{StaticResource StdInfoLabel}">
                                                <Label.Triggers>
                                                    <DataTrigger TargetType="Label" Binding="{Binding ContentComplexityDescription}" Value="">
                                                        <Setter Property="IsVisible" Value="False"/>
                                                    </DataTrigger>
                                                </Label.Triggers>
                                                <Label.FormattedText>
                                                    <FormattedString>
                                                        <Span Text="Content Complexity: " />
                                                        <Span Text="{Binding ContentComplexityDescription}"/>
                                                    </FormattedString>
                                                </Label.FormattedText>
                                            </Label>
                                            <Label Style="{StaticResource StdInfoLabel}">
                                                <Label.Triggers>
                                                    <DataTrigger TargetType="Label" Binding="{Binding DateStandard}" Value="">
                                                        <Setter Property="IsVisible" Value="False"/>
                                                    </DataTrigger>
                                                </Label.Triggers>
                                                <Label.FormattedText>
                                                    <FormattedString>
                                                        <Span Text="Date Adopted/Revised: " />
                                                        <Span Text="{Binding DateStandard}"/>
                                                    </FormattedString>
                                                </Label.FormattedText>
                                            </Label>

                                        </StackLayout>
                                    </Grid>
                                </telerikPrimitives:RadBorder>
                                <telerikPrimitives:RadBorder CornerRadius="0, 0, 15, 15" Padding="0" Margin="0,-2,12,0">
                                    <telerikPrimitives:RadBorder.Triggers>
                                        <DataTrigger TargetType="telerikPrimitives:RadBorder" Binding="{Binding ResourceCount}" Value="0">
                                            <Setter Property="IsVisible" Value="false"/>
                                        </DataTrigger>
                                    </telerikPrimitives:RadBorder.Triggers>
                                    <Grid BackgroundColor="#F29A33" Padding="0,5,0,5">
                                        <Grid.GestureRecognizers>
                                            <TapGestureRecognizer Tapped="PreviewStd" />
                                        </Grid.GestureRecognizers>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="19"/>
                                            <ColumnDefinition Width="*"/>
                                            <ColumnDefinition Width="40"/>
                                            <ColumnDefinition Width="7"/>
                                        </Grid.ColumnDefinitions>
                                        <StackLayout Grid.Column="1"  Padding="0,0,5,10">
                                            <StackLayout.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="PreviewStd"/>
                                            </StackLayout.GestureRecognizers>
                                            <Label Style="{StaticResource previewRelatedResourceLabel}">
                                                <Label.GestureRecognizers>
                                                    <TapGestureRecognizer Tapped="PreviewStd"/>
                                                </Label.GestureRecognizers>
                                                <Label.FormattedText>
                                                    <FormattedString>
                                                        <Span Text="{Binding ResourceCount}" FontSize="{StaticResource LargeHeaderSize}" />
                                                        <Span Text="{Binding RelatedResourcesLabel}" />
                                                    </FormattedString>
                                                </Label.FormattedText>
                                            </Label>
                                        </StackLayout>
                                        <StackLayout Grid.Column="2" Spacing="0" Padding="0,5,0,0">
                                            <StackLayout.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="PreviewStd"/>
                                            </StackLayout.GestureRecognizers>
                                            <Image Source="rightarrow" HeightRequest="31" WidthRequest="31" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,0,0"/>
                                        </StackLayout>
                                    </Grid>
                                </telerikPrimitives:RadBorder>
                            </StackLayout>
                        </telerikListView:ListViewTemplateCell.View>
                    </telerikListView:ListViewTemplateCell>
                </DataTemplate>
            </telerikDataControls:RadListView.ItemTemplate>
            <telerikDataControls:RadListView.LayoutDefinition>
                <telerikListView:ListViewLinearLayout  VerticalItemSpacing="4"/>
            </telerikDataControls:RadListView.LayoutDefinition>
        </telerikDataControls:RadListView>
        <local:NavigationBar Grid.Row="1" prism:ViewModelLocator.AutowirePartialView="{x:Reference parent}" VerticalOptions="End"/>
        <local:LoadingPanel  Grid.RowSpan="2" prism:ViewModelLocator.AutowirePartialView="{x:Reference parent}" IsVisible="{Binding AppModel.IsBusy}"/>
    </Grid>
</ContentPage>

视图模型:

using Prism.Commands;
using Prism.Navigation;
using System;
using Xamarin.Forms;
using Xamarin.Essentials;

namespace StandardsView.ViewModels
{
    public class PreviewStandardViewModel : ViewModelBase
    {
        public DelegateCommand PreviewCommand { get; }

        public PreviewStandardViewModel(INavigationService navigationService)
            : base(navigationService)
        {
            App.GlobalAppModel.Benchmarks[0].ShareCommand = new DelegateCommand(() => ShareBenchmark());
            AppModel = App.GlobalAppModel;
            ShowBackButton = true;
            Instructions = "Benchmark details";
            PreviewCommand = new DelegateCommand(() => PreviewBenchmark());

        }

        private void PreviewBenchmark()
        {
            Launcher.OpenAsync(new Uri(string.Format(Constants.previewStandardUrl, App.GlobalAppModel.Benchmarks[0].ID)));
        }

        private void ShareBenchmark()
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                string strUri = string.Format(Constants.previewStandardUrl, App.GlobalAppModel.Benchmarks[0].ID);
                string strTitle = App.GlobalAppModel.Benchmarks[0].Code;
                string strText = App.GlobalAppModel.Benchmarks[0].Code + " - " + App.GlobalAppModel.Benchmarks[0].Description;
                await Share.RequestAsync(new ShareTextRequest
                {
                    Uri = strUri,
                    Title = strTitle,
                    Text = strText
                });
            });
        }
    }
}

还有一个重要的信息,我必须提到,在上面的代码中,您将在模型类中看到一个DelegateCommand声明在其中,在ViewModel类中,您将看到此委托被分配给该方法,这是我的最后一次尝试,在尝试之前,我使用了:


因此,所有这些情况都会导致相同的行为,我现在共享了我所有的代码,希望这将有助于更好地理解我的问题。

1。请检查是否有任何其他视图与您的
堆栈布局重叠。被其他视图重叠的区域将不会响应
TapGestureRecognizer

2.在
主线程中运行共享代码

private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{

    Device.BeginInvokeOnMainThread(async () => {
        await Share.RequestAsync(new ShareTextRequest
        {
            Uri = "http://myurl",
            Title = "My Title"
        });
    });
}

我创建了一个新项目,并在其中添加了代码,共享窗口在iOS端运行良好。

如果它的异步方法只需点击一次就可以了。在此之前,您可以禁用按钮或显示微调器或其他功能,以防止在第一个请求完成之前多次点击!由于iOS操作速度慢,我从未遇到过这个问题。感谢您对@NirmalSubedi的评论,根据当前的多次触摸,出于测试目的,我只触摸了一次,然后等待,但什么也没有发生,然后我再次尝试并等待。。。共享弹出窗口出现了6次,我不知道为什么iPad和iPhone的速度会这么慢,正如我说的,我不确定这是一个缓慢的问题还是另一个未知的问题,这是一个简单的代码,没有什么疯狂之处,它就像安卓设备上的sharm一样工作。有什么想法吗?你能和我分享一个工作代码吗?谢谢Jack,我尝试了你提供的代码,但我还是得到了同样的行为,我也仔细看了你的第一点,我的StackLayout没有重叠,实际上我试了6次点击共享图标,直到在Android上第一次触摸共享时出现弹出窗口。我同意可能是我的页面上的某些东西导致了这一点,我将更新我的第一个问题,并添加我的xaml的全部代码,以便您可以查看它,因为我知道底部还有其他的点击事件,它将在浏览器上运行,并且在IOS上运行良好,我将向我的第一个问题添加信息question@FadlAssaad好啊一旦你更新了代码,我会检查它。我更新了代码,请检查并让我知道你的想法。@FadlAssaad我首先要做的是在ShareBenchmark方法中添加一个断点,然后调试它,看看当你单击图像或stacklayout时断点是否命中。然后,如果点击,等待共享窗口弹出。如果它没有击中,问题就出在你的布局上。我会用红色背景的boxView替换图像并再次测试,然后我们可以看到boxView的实际区域,然后单击它以查看是否触发了ShareBenchmark方法。感谢您的提示,我会尝试,问题是模拟器没有在mac上运行该应用,所以我每次都会把新的测试版本推到TestFlight上,并在iPad/iPhone上进行检查。我会做一些研究,以检查为什么emulator会停留在初始屏幕上,因为我知道我创建了一个非常基本的应用程序,默认主页上有标签,而且该应用程序没有在emulator上打开,因此我无法调试,无论如何,我会检查我是否能解决这个问题,并会让你知道。
<StackLayout Grid.Column="2" Grid.ColumnSpan="2" Spacing="0" Margin="0,5,13,0">
   <StackLayout.GestureRecognizers>
      <TapGestureRecognizer Tapped="ImageButton_Clicked"/>
   </StackLayout.GestureRecognizers>
   <Image Source="export" HeightRequest="27" WidthRequest="20" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,0,0"/>
</StackLayout>
private void ImageButton_Clicked(object sender, System.EventArgs e)
{
       Device.BeginInvokeOnMainThread(async () =>
            {
                string strUri = string.Format(Constants.previewStandardUrl, App.GlobalAppModel.Benchmarks[0].ID);
                string strTitle = App.GlobalAppModel.Benchmarks[0].Code;
                string strText = App.GlobalAppModel.Benchmarks[0].Code + " - " + App.GlobalAppModel.Benchmarks[0].Description;
                await Share.RequestAsync(new ShareTextRequest
                {
                    Uri = strUri,
                    Title = strTitle,
                    Text = strText
                });
            });
}
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{

    Device.BeginInvokeOnMainThread(async () => {
        await Share.RequestAsync(new ShareTextRequest
        {
            Uri = "http://myurl",
            Title = "My Title"
        });
    });
}