【问题标题】:Xamarin Forms - Muiltiple pages open when label tappedXamarin Forms - 点击标签时打开多个页面
【发布时间】:2016-12-19 04:52:15
【问题描述】:

我使用了几个标签,当用户点击其中一个标签时,它会打开一个新页面。但问题是,只要有人点击其中一个标签,就会打开多个页面。

下面我会附上xaml和代码。

Xaml

 <StackLayout x:Name="dropdownStack" Padding="10" VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Vertical" BackgroundColor="#033c73" IsVisible="False">  
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Home"/>  
      <Label x:Name="ddmenu_Home" HorizontalOptions="FillAndExpand" Text="Home" TextColor="#ffffff"/>
    </StackLayout> 
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Social"/> 
      <Label x:Name="ddmenu_Social" HorizontalOptions="FillAndExpand" Text="Social" TextColor="#ffffff"/>
    </StackLayout>   
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Careers"/>  
      <Label x:Name="ddmenu_Careers" HorizontalOptions="FillAndExpand" Text="Careers" TextColor="#ffffff"/>
    </StackLayout>  
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Schedule"/>
      <Label x:Name="ddmenu_MySchedule" HorizontalOptions="FillAndExpand" Text="My Schedule" TextColor="#ffffff"/>
    </StackLayout>
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Contact"/>
      <Label x:Name="ddmenu_Contact" HorizontalOptions="FillAndExpand" Text="Contact" TextColor="#ffffff"/>
    </StackLayout> 
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ddm_Details"/>
      <Label x:Name="ddmenu_MyDetails" HorizontalOptions="FillAndExpand" Text="My Details" TextColor="#ffffff"/>
    </StackLayout>
    <StackLayout VerticalOptions="Fill" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
      <Image Source="ic_video"/>
      <Label x:Name="ddmenu_Videos" HorizontalOptions="FillAndExpand" Text="Videos" TextColor="#ffffff"/>
    </StackLayout>
  </StackLayout>

C#

public void OnDropdownItemPressed()
{
    dropdownStack.IsVisible = !dropdownStack.IsVisible;

    ddmenu_Home.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            Navigation.PushAsync(new MainPage());
        })
    });

    ddmenu_Social.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            Navigation.PushAsync(new SocialPage());
        })
    });

    ddmenu_Careers.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            Navigation.PushAsync(new CareersPage());
        })
    });

    ddmenu_MySchedule.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            RegisterDeviceWithWebview(ProjectVariables.URL + ProjectVariables.URL_EXT_SCHEDULE, ProjectVariables.regID);
        })
    });

    ddmenu_Contact.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            RegisterDeviceWithWebview(ProjectVariables.URL + ProjectVariables.URL_EXT_CONTACT, ProjectVariables.regID);
        })
    });

    ddmenu_MyDetails.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() =>
        {
            RegisterDeviceWithWebview(ProjectVariables.URL + ProjectVariables.URL_EXT_DETAILS, ProjectVariables.regID);
        })
    });

    ddmenu_Videos.GestureRecognizers.Add(new TapGestureRecognizer
    {
        Command = new Command(() => 
        {
            RegisterDeviceWithWebview(ProjectVariables.URL + ProjectVariables.URL_EXT_VIDEOS, ProjectVariables.regID);
        })
    });
}

如果有人可以提供帮助,那就太好了。

【问题讨论】:

  • 我的建议怎么样?

标签: c# .net wpf xaml xamarin.forms


【解决方案1】:

我有假设。每次,当您的方法OnDropdownItemPressed 被调用时,您都在添加GestureRecognizers,因此每个Label 都有许多识别器而不是一个。所以,我想建议在页面的构造函数中做所有Recognizers 的东西。

【讨论】:

  • 投票可能是原因
【解决方案2】:

删除每个包含图像和标签的StackLayout 上的VerticalOptions="Fill"。使用此选项,您告诉StackLayout 它应该填充空间。

我认为这是问题所在,您的所有 StackLayouts 都是堆叠的(它们不应该堆叠,只是一个接一个)。

【讨论】:

  • 我删除了 VerticalOptions="Fill" 并且它仍在发生。
【解决方案3】:

您应该在点击后立即禁用按钮或图像并等待页面被推送然后再次启用它

ddmenu_Home.GestureRecognizers.Add(new TapGestureRecognizer
            {
                Command = new Command(() =>
                {
                    ddmenu_Home.IsEnabled = false;
                    await Navigation.PushAsync(new MainPage());
                    ddmenu_Home.IsEnabled = true;
                })
            });

【讨论】:

  • 不幸的是,同样的事情仍在发生。
  • 我是否需要在 Navigation.PushAsync() 前面添加 await 关键字,即使它不是 async 方法的一部分?
  • 不,没有必要。如果您认为用户应该等待此页面,请添加它并使方法异步
  • 你能解决这个问题吗?
  • 它不起作用,因为在没有等待的情况下等待 IsEnabled 设置为 true。等待者不等待第二步...
【解决方案4】:

参考以下方法。

if (Application.Current.MainPage.Navigation.NavigationStack.Count == 0 || Application.Current.MainPage.Navigation.NavigationStack.Last().GetType() != typeof(YourPage))
{
    await navigationService.PushTo(new YourPage);
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多