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