2016-08-18 70 views
0

我想写一个Xamarin Page类,模仿Pivot控件,该控件在Windows Phone上由TabbedPage使用,但在Windows桌面上不可用。因此,我想让它拥有几个子女Page s,其中只有一个会在同一时间显示,同时还有一个控制它自己的控件,允许用户在孩子之间切换。我将如何去做这件事?如何创建一个可以托管其他页面的Xamarin页面?

回答

0

你正在寻找CarouselView。它在上使用FlipView WinRTUWP平台。

你可以从Xamarin blogXamarinhelp.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; 
     } 
    } 
} 

现在我有,我可以创建一个包含PageView一个ContentPage,我有我想要的。

相关问题