diff --git a/Ooui.Forms/Exports.cs b/Ooui.Forms/Exports.cs index e9c192f..e6e445e 100644 --- a/Ooui.Forms/Exports.cs +++ b/Ooui.Forms/Exports.cs @@ -16,6 +16,7 @@ using Xamarin.Forms; [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] [assembly: ExportRenderer (typeof (LinkLabel), typeof (LinkLabelRenderer))] [assembly: ExportRenderer (typeof (LinkView), typeof (LinkViewRenderer))] +[assembly: ExportRenderer(typeof(Picker), typeof(PickerRenderer))] [assembly: ExportRenderer(typeof(ListView), typeof(ListViewRenderer))] [assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))] [assembly: ExportRenderer (typeof (SearchBar), typeof (SearchBarRenderer))] diff --git a/Ooui.Forms/Renderers/PickerRenderer.cs b/Ooui.Forms/Renderers/PickerRenderer.cs new file mode 100644 index 0000000..9f14b06 --- /dev/null +++ b/Ooui.Forms/Renderers/PickerRenderer.cs @@ -0,0 +1,88 @@ +using Ooui.Forms.Extensions; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using Xamarin.Forms; +using Xamarin.Forms.Internals; + +namespace Ooui.Forms.Renderers +{ + public class PickerRenderer : ViewRenderer + { + private bool _disposed; + private Select _select; + + public PickerRenderer() + { + } + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + if (e.NewElement != null) + { + if (Control == null) + { + _select = new Select(); + _select.Change += _select_Change; + + SetNativeControl(_select); + } + + UpdateItems(); + UpdateBackgroundColor(); + } + + base.OnElementChanged(e); + } + + private void _select_Change(object sender, TargetEventArgs e) + { + Element.SetValueFromRenderer(Picker.SelectedIndexProperty, Element.ItemsSource.IndexOf(_select.Value)); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == Picker.ItemsSourceProperty.PropertyName) + { + UpdateItems(); + } + + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing && !_disposed) + { + _select.Change -= _select_Change; + _disposed = true; + } + } + + private void UpdateBackgroundColor() + { + var backgroundColor = Element.BackgroundColor.ToOouiColor(); + + _select.Style.BackgroundColor = backgroundColor; + } + + private void UpdateItems() + { + var items = Element.ItemsSource; + + if (items != null) + { + foreach (var item in items) + { + var s = item.ToString(); + _select.AddOption(s, s); + } + } + } + + } + +} diff --git a/Samples/PickerSample.cs b/Samples/PickerSample.cs new file mode 100644 index 0000000..d804d68 --- /dev/null +++ b/Samples/PickerSample.cs @@ -0,0 +1,75 @@ +using Ooui; +using System; +using System.Collections.Generic; +using Xamarin.Forms; + +namespace Samples +{ + public class PickerSample : ISample + { + private Xamarin.Forms.Label _label; + private Xamarin.Forms.Picker _picker; + + public string Title => "Xamarin.Forms Picker Sample"; + + List myItems = new List + { + "red", + "green", + "yellow", + "blue", + "white", + "black", + "purple", + "orange", + }; + + public Ooui.Element CreateElement() + { + var panel = new StackLayout(); + + var titleLabel = new Xamarin.Forms.Label + { + Text = "Picker", + FontSize = 24, + FontAttributes = FontAttributes.Bold + }; + panel.Children.Add(titleLabel); + + _picker = new Picker + { + Title = "Hello", + //VerticalOptions = LayoutOptions.CenterAndExpand, + ItemsSource = myItems, + }; + + panel.Children.Add(_picker); + + _picker.SelectedIndexChanged += OnPickerValueChanged; + + _label = new Xamarin.Forms.Label + { + Text = "Picker value is", + HorizontalOptions = LayoutOptions.Center + }; + panel.Children.Add(_label); + + var page = new ContentPage + { + Content = panel + }; + + return page.GetOouiElement(); + } + + void OnPickerValueChanged(object sender, EventArgs e) + { + _label.Text = String.Format("Picker value is {0} ({1})", _picker.SelectedIndex, myItems[_picker.SelectedIndex]); + } + + public void Publish() + { + UI.Publish("/picker", CreateElement); + } + } +} diff --git a/Samples/Program.cs b/Samples/Program.cs index e77bab4..a80416b 100644 --- a/Samples/Program.cs +++ b/Samples/Program.cs @@ -43,6 +43,7 @@ namespace Samples new WeatherAppSample().Publish(); new XuzzleSample().Publish(); new WebViewSample().Publish(); + new PickerSample().Publish(); UI.Present ("/display-alert");