【发布时间】:2019-01-03 14:05:20
【问题描述】:
我注意到可以创建带有嵌套标签的移动应用程序。
这在 Xamarin Forms 中可行吗? 请看下面的屏幕截图:
我可以使用TabbedPage 在 iOS 上创建底部标签,但是如何在页面顶部创建嵌套标签?
谢谢
【问题讨论】:
-
这是一个分段控件,不是标签
标签: c# xamarin.forms
我注意到可以创建带有嵌套标签的移动应用程序。
这在 Xamarin Forms 中可行吗? 请看下面的屏幕截图:
我可以使用TabbedPage 在 iOS 上创建底部标签,但是如何在页面顶部创建嵌套标签?
谢谢
【问题讨论】:
标签: c# xamarin.forms
与在本机应用程序上执行的方式相同。没有原生嵌套选项卡,因此 Xamarin 无法支持它,因为这种东西不存在。
在本机应用程序中,您在顶部有控件(在 iOS 上称为 SegmentedControl,而在 Android 上没有开箱即用的控件),您可以在其中选择值,然后在单击时手动更改下面的视图。
【讨论】:
这在 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.
});
}
【讨论】: