2016-08-18 3 views
0

Windows PhoneでTabbedPageで使用されているがWindowsデスクトップでは使用できないPivotコントロールを模倣したXamarin Pageクラスを作成したいと思います。だから私はそれをホストしているいくつかの子供Page、そのうちの1つだけが表示されるだけでなく、ユーザーが子供の間で切り替えることができます独自のコントロールです。私はこれについてどうやって行くのですか?他のページをホストできるXamarin Pageを作成するにはどうすればよいですか?

答えて

0

あなたは正確にCarouselViewを探しています。これは、FlipViewWinRTUWPプラットフォームで使用します。

さらに詳しい情報は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を作成することができることを持っている、と私は私が欲しいものを持っています。

関連する問題