summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs105
1 files changed, 105 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs b/Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs
new file mode 100644
index 00000000..9192fc6f
--- /dev/null
+++ b/Xamarin.Forms.Platform.WP8/TabbedPageRenderer.cs
@@ -0,0 +1,105 @@
+using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using Microsoft.Phone.Controls;
+
+namespace Xamarin.Forms.Platform.WinPhone
+{
+ public class TabbedPagePresenter : System.Windows.Controls.ContentPresenter
+ {
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ DependencyObject parent = VisualTreeHelper.GetParent(this);
+ while (parent != null && !(parent is PivotItem))
+ parent = VisualTreeHelper.GetParent(parent);
+
+ var pivotItem = parent as PivotItem;
+ if (pivotItem == null)
+ throw new Exception("No parent PivotItem found for tab");
+
+ pivotItem.SizeChanged += (s, e) =>
+ {
+ if (pivotItem.ActualWidth > 0 && pivotItem.ActualHeight > 0)
+ {
+ var tab = (Page)DataContext;
+ ((TabbedPage)tab.RealParent).ContainerArea = new Rectangle(0, 0, pivotItem.ActualWidth, pivotItem.ActualHeight);
+ }
+ };
+ }
+ }
+
+ public class TabbedPageRenderer : Pivot, IVisualElementRenderer
+ {
+ TabbedPage _page;
+ BackgroundTracker<Control> _tracker;
+
+ public TabbedPageRenderer()
+ {
+ SetBinding(TitleProperty, new System.Windows.Data.Binding("Title"));
+ SetBinding(ItemsSourceProperty, new System.Windows.Data.Binding("Children"));
+ HeaderTemplate = (System.Windows.DataTemplate)System.Windows.Application.Current.Resources["TabbedPageHeader"];
+ ItemTemplate = (System.Windows.DataTemplate)System.Windows.Application.Current.Resources["TabbedPage"];
+
+ SelectionChanged += OnSelectionChanged;
+ }
+
+ public UIElement ContainerElement
+ {
+ get { return this; }
+ }
+
+ public VisualElement Element
+ {
+ get { return _page; }
+ }
+
+ public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
+
+ public SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint)
+ {
+ return new SizeRequest(new Size(widthConstraint, heightConstraint));
+ }
+
+ public void SetElement(VisualElement element)
+ {
+ TabbedPage oldElement = _page;
+ _page = (TabbedPage)element;
+ _tracker = new BackgroundTracker<Control>(BackgroundProperty) { Model = _page, Element = this };
+
+ DataContext = element;
+
+ _page.PropertyChanged += OnPropertyChanged;
+
+ Loaded += (sender, args) => _page.SendAppearing();
+ Unloaded += (sender, args) => _page.SendDisappearing();
+
+ OnElementChanged(new VisualElementChangedEventArgs(_page, element));
+ }
+
+ protected virtual void OnElementChanged(VisualElementChangedEventArgs e)
+ {
+ EventHandler<VisualElementChangedEventArgs> changed = ElementChanged;
+ if (changed != null)
+ changed(this, e);
+ }
+
+ void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == "CurrentPage")
+ {
+ Page current = _page.CurrentPage;
+ if (current != null)
+ SelectedItem = current;
+ }
+ }
+
+ void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ _page.CurrentPage = (Page)SelectedItem;
+ }
+ }
+} \ No newline at end of file