我想编写一个Xamarin Page
类,它模仿Pivot
控件,该控件在Windows Phone上由TabbedPage
使用,但在Windows桌面上不可用。因此,我希望它拥有多个子Page
,其中只有一个可以一次显示,以及它自己的控制,这将允许用户在孩子之间切换。我该怎么做呢?
答案 0 :(得分:0)
你正好看CarouselView
。它在 WinRT 和 UWP 平台上使用FlipView
。
您可以从Xamarin blog和Xamarinhelp.com找到更多信息。他们还有预发布nuget包。
答案 1 :(得分:0)
我认为你必须自己写这个。使用CarouselView,将其添加到Grid或AbsoluteLayout或RelativeLayout(我的意思是,将它放在背景上,这样您就可以在其上添加标题的轮播。或者您可能不想这样做,在在哪种情况下,您只需使用垂直堆栈布局)。您还需要添加自定义控件以进行导航,并在页面标题轮播和实际页面轮播之间同步更改。
答案 2 :(得分:0)
我找到了关于如何在视图中托管页面的this blog post。基于此,我做了以下视图类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace SGB
{
public class PageView : View
{
public PageView()
{
}
public static readonly BindableProperty ContentProperty = BindableProperty.Create<PageView,Page> (s => s.Content, null);
public Page Content {
get
{
return (Page)GetValue (ContentProperty);
}
set
{
SetValue (ContentProperty, value);
LayoutContent();
}
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
LayoutContent();
}
private void LayoutContent()
{
if (Content != null)
{
Content.Layout(new Rectangle(0, 0, Width, Height));
}
}
}
}
和此渲染器类:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.WinRT;
using Page = Xamarin.Forms.Page;
using SGB;
[assembly: ExportRenderer(typeof(PageView), typeof(SGB.Windows.PageViewRenderer))]
namespace SGB.Windows
{
public class PageViewRenderer : ViewRenderer<PageView, FrameworkElement>
{
private Page currentPage;
private FrameworkElement FrameworkElement;
public PageViewRenderer()
: base()
{
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if ((e.PropertyName == "Content") || (e.PropertyName == "Renderer"))
{
SetPage(((PageView)Element).Content);
}
}
private void SetPage(Page page)
{
if (page == currentPage)
{
return;
}
if (currentPage != null)
{
((IPageController)page).SendDisappearing();
currentPage.Parent = null;
}
currentPage = page;
if (page != null)
{
var renderer = page.GetOrCreateRenderer();
FrameworkElement = renderer.ContainerElement;
SetNativeControl(FrameworkElement);
page.Parent = FindPage();
((IPageController)page).SendAppearing();
}
}
private Page FindPage()
{
for (Element element = Element; element != null; element = element.Parent)
{
if (element is Page)
{
return (Page)element;
}
}
return null;
}
}
}
现在我有了,我可以创建一个包含ContentPage
的{{1}},我就拥有了我想要的东西。