2016-08-18 8 views
0

Я хотел бы написать класс Xamarin Page, который имитирует элемент управления Pivot, который используется TabbedPage на Windows Phone, но недоступен в Windows Desktop. Поэтому я хочу, чтобы у него было несколько дочерних Page s, только один из них будет виден одновременно, а также собственный контроль, который позволит пользователю переключаться между дочерними элементами. Как я могу это сделать?Как создать страницу Xamarin, на которой могут размещаться другие страницы?

ответ

0

Вы точно смотрите CarouselView. Он использует FlipView на WinRT и UWP платформы.

Более подробную информацию вы найдете от Xamarin blog и Xamarinhelp.com. Они также имеют предварительный выпуск пакета nuget.

+0

CarouselView отображает хосты, а не страницы. – Simon

0

Думаю, вам придется писать это самостоятельно. Используйте CarouselView, добавьте его в Grid или AbsoluteLayout или RelativeLayout (я имею в виду, поставлю его на фон, чтобы вы могли добавить на него карусель названий. Или вы не хотите этого делать, и в этом случае вы просто используйте вертикальную компоновку стека). Вам также нужно будет добавить настраиваемый элемент управления для навигации и синхронизировать изменения между каруселями заголовков страниц и фактическими страницами карусели.

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, содержащий PageView, и у меня есть то, что я хочу ,