【问题标题】:Xamarin Forms Nested TabsXamarin 表单嵌套选项卡
【发布时间】:2019-01-03 14:05:20
【问题描述】:

我注意到可以创建带有嵌套标签的移动应用程序。

这在 Xamarin Forms 中可行吗? 请看下面的屏幕截图:

我可以使用TabbedPage 在 iOS 上创建底部标签,但是如何在页面顶部创建嵌套标签?

谢谢

【问题讨论】:

标签: c# xamarin.forms


【解决方案1】:

与在本机应用程序上执行的方式相同。没有原生嵌套选项卡,因此 Xamarin 无法支持它,因为这种东西不存在。

在本机应用程序中,您在顶部有控件(在 iOS 上称为 SegmentedControl,而在 Android 上没有开箱即用的控件),您可以在其中选择值,然后在单击时手动更改下面的视图。

【讨论】:

    【解决方案2】:

    这在 Xamarin Forms 中是否可行?

    当然可以。可以使用CustomRenderer来实现。参考以下代码。

    在 iOS 项目中。创建 pageRenderer

    using System;
    
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.iOS;
    
    using app1;
    using app1.iOS;
    
    using UIKit;
    using Foundation;
    using CoreGraphics;
    using ObjCRuntime;
    
    [assembly:ExportRenderer(typeof(MyPage1),typeof(MyPageRenderer))]
    namespace app1.iOS
    {
      public class MyPageRenderer:PageRenderer
      {
        public MyPageRenderer()
        {
        }
    
    
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
    
            if (ViewController != null)
            {
    
               NSArray items = NSArray.FromStrings(new string[] { "Courses", "Favourite", "Recent" });
    
               UISegmentedControl segmentedControl = new UISegmentedControl(items)
               {
                  Frame = new CGRect(50, 20, NativeView.Bounds.Width - 100, 35)
               };
    
               segmentedControl.SelectedSegment = 0;
               segmentedControl.TintColor = UIColor.Red;
               segmentedControl.ApportionsSegmentWidthsByContent = true; //Change the width of the segment based on the content of the segment
    
               segmentedControl.AddTarget(this, new Selector("ValueChanged:"), UIControlEvent.ValueChanged);
    
               NativeView.AddSubview(segmentedControl);
            }
        }
    
    
        [Export("ValueChanged:")]
        void ValueChanged(UISegmentedControl sender)
        {
           MessagingCenter.Send<Object, int>(this, "ClickSegmentedControl", (int)sender.SelectedSegment);
    
            // switch((int)sender.SelectedSegment){
            //  case 0:
    
            //      break;
    
            //  case 1:
    
            //      break;
    
            //  case 2:
    
            //      break;
    
            //  default:
    
            //      break;
    
            //}
         }
    
      }
    }
    

    在表单中,你可以订阅消息。如果你想在点击分段时处理表单中的事件。

    public MyPage1()
    {
       //...
    
       MessagingCenter.Subscribe<Object, int>(this, "ClickSegmentedControl", (sender, arg) =>
       {
                Console.WriteLine(arg); //arg is num of the segment that you clicked.
       });
    
    
    } 
    

    【讨论】:

    • 在页面渲染器中添加这个既过分又不灵活 - 您可以并且应该在 XAML 或后端代码中将本机控件添加到页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多