如何创建一个可以承载其他页面的Xamarin页面?



我想写一个Xamarin Page类,模仿TabbedPage在Windows Phone上使用的Pivot控件,但在Windows Desktop上不可用。所以我想让它托管几个孩子Page,其中只有一个将是可见的一次,以及它自己的控制,这将允许用户在孩子之间切换。我该怎么做呢?

你看到的正是CarouselView。它在WinRTUWP平台上使用FlipView

您可以在Xamarin博客和Xamarinhelp.com上找到更多信息。他们也有预发布的nuget包

我想你得自己写了。使用CarouselView,将它添加到Grid或AbsoluteLayout或RelativeLayout(我的意思是,把它放在背景上,这样你就能在它上面添加标题的carousel。或者你可能不想这样做,在这种情况下,你会使用垂直堆栈布局)。您还需要为导航添加自定义控件,并同步页面标题carousel和实际页面carousel之间的更改。

我找到了这篇关于如何在视图中托管页面的博客文章。基于此,我创建了如下视图类:

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,我想要的

相关内容

  • 没有找到相关文章

最新更新