Я хотел бы написать класс Xamarin Page
, который имитирует элемент управления Pivot
, который используется TabbedPage
на Windows Phone, но недоступен в Windows Desktop. Поэтому я хочу, чтобы у него было несколько дочерних Page
s, только один из них будет виден одновременно, а также собственный контроль, который позволит пользователю переключаться между дочерними элементами. Как я могу это сделать?Как создать страницу Xamarin, на которой могут размещаться другие страницы?
ответ
Вы точно смотрите CarouselView
. Он использует FlipView
на WinRT и UWP платформы.
Более подробную информацию вы найдете от Xamarin blog и Xamarinhelp.com. Они также имеют предварительный выпуск пакета nuget.
Думаю, вам придется писать это самостоятельно. Используйте CarouselView, добавьте его в Grid или AbsoluteLayout или RelativeLayout (я имею в виду, поставлю его на фон, чтобы вы могли добавить на него карусель названий. Или вы не хотите этого делать, и в этом случае вы просто используйте вертикальную компоновку стека). Вам также нужно будет добавить настраиваемый элемент управления для навигации и синхронизировать изменения между каруселями заголовков страниц и фактическими страницами карусели.
Я нашел 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
, содержащий PageView
, и у меня есть то, что я хочу ,
CarouselView отображает хосты, а не страницы. – Simon