Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions Demo/SecondPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@
Spacing="12">
<controls:SegmentedControl x:Name="SegControl" ValueChanged="Handle_ValueChanged">
<controls:SegmentedControl.Children>
<controls:SegmentedControlOption Text="Items" />
<controls:SegmentedControlOption Text="Notes" />
<controls:SegmentedControlOption Text="Approvers" />
<controls:SegmentedControlOption Text="Attachments" />
<controls:SegmentedControlOption Text="{Binding Text}" />
<controls:SegmentedControlOption Text="{Binding Text}" />
<controls:SegmentedControlOption Text="{Binding Text}" />
<controls:SegmentedControlOption Text="{Binding Text}" />
</controls:SegmentedControl.Children>
</controls:SegmentedControl>
<StackLayout x:Name="SegContent" />
<StackLayout Orientation="Vertical">
<StackLayout x:Name="SegContent" />
<Button Text="Change Text" Clicked="Handle_ChangeTextClicked" />
</StackLayout>
</StackLayout>
</ContentPage>
14 changes: 14 additions & 0 deletions Demo/SecondPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,25 @@ namespace Demo
{
public partial class SecondPage : ContentPage
{
private readonly SecondPageViewModel viewModel;

public SecondPage()
{
InitializeComponent();

viewModel = new SecondPageViewModel
{
Text = "Hello World!"
};

Title = "Second Page";
BindingContext = viewModel;
}

private int counter = 0;
void Handle_ChangeTextClicked(object sender, System.EventArgs e)
{
viewModel.Text = (++counter).ToString();
}

void Handle_ValueChanged(object sender, SegmentedControl.FormsPlugin.Abstractions.ValueChangedEventArgs e)
Expand Down
25 changes: 25 additions & 0 deletions Demo/SecondPageViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using System.ComponentModel;

namespace Demo
{
public class SecondPageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private string _text;
public string Text
{
get { return _text; }
set
{
if (_text != value)
{
_text = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text)));
}
}

}
}
}
2,299 changes: 70 additions & 2,229 deletions Droid/Resources/Resource.designer.cs

Large diffs are not rendered by default.

12 changes: 0 additions & 12 deletions SegmentedControl.userprefs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="2.5.0.121934" />
</ItemGroup>
<ItemGroup>
<Compile Remove="SegmentedControlList.cs" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using Xamarin.Forms;

Expand All @@ -14,10 +15,18 @@ public class SegmentedControl : View, IViewContainer<SegmentedControlOption>

public SegmentedControl()
{
Children = new List<SegmentedControlOption>();
}
Children = new SegmentedControlOptionList(this);
}

protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();

public static readonly BindableProperty TintColorProperty = BindableProperty.Create("TintColor", typeof(Color), typeof(SegmentedControl), Color.Blue);
foreach (var child in Children)
child.BindingContext = this.BindingContext;
}

public static readonly BindableProperty TintColorProperty = BindableProperty.Create("TintColor", typeof(Color), typeof(SegmentedControl), Color.Blue);

public Color TintColor
{
Expand Down Expand Up @@ -71,9 +80,27 @@ public string Text
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
}

public class SegmentedControlOptionList : ObservableCollection<SegmentedControlOption>
{
private readonly SegmentedControl _parent;

internal SegmentedControlOptionList(SegmentedControl parent)
{
_parent = parent;
}

protected override void InsertItem(int index, SegmentedControlOption item)
{
if (item.BindingContext == null)
item.BindingContext = _parent.BindingContext;
base.InsertItem(index, item);
}
}


public class ValueChangedEventArgs : EventArgs
public class ValueChangedEventArgs : EventArgs
{
public int NewValue { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,46 @@ public SegmentedControlRenderer(Context context) : base(context)

protected override void OnElementChanged(ElementChangedEventArgs<Abstractions.SegmentedControl> e)
{
base.OnElementChanged(e);
base.OnElementChanged(e);

var layoutInflater = LayoutInflater.From(context);

if (Control == null)
if (Control == null)
{
// Instantiate the native control and assign it to the Control property with
// the SetNativeControl method

var layoutInflater = LayoutInflater.From(context);

var view = layoutInflater.Inflate(Resource.Layout.RadioGroup, null);

nativeControl = (RadioGroup)layoutInflater.Inflate(Resource.Layout.RadioGroup, null);

for (var i = 0; i < Element.Children.Count; i++)
SetNativeControl(nativeControl);
}

if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources

var oldElement = e.OldElement;
for (var i = 0; i < oldElement.Children.Count; i++)
{
var o = Element.Children[i];
var o = oldElement.Children[i];
o.PropertyChanged -= Child_PropertyChanged;
}

if (nativeControl != null)
nativeControl.CheckedChange -= NativeControl_ValueChanged;
}

if (e.NewElement != null)
{
// Configure the control and subscribe to event handlers

var newElement = e.NewElement;
for (var i = 0; i < newElement.Children.Count; i++)
{
var o = newElement.Children[i];
o.PropertyChanged += Child_PropertyChanged;
var rb = (RadioButton)layoutInflater.Inflate(Resource.Layout.RadioButton, null);

rb.LayoutParameters = new RadioGroup.LayoutParams(0, LayoutParams.WrapContent, 1f);
Expand All @@ -57,31 +81,34 @@ protected override void OnElementChanged(ElementChangedEventArgs<Abstractions.Se
nativeControl.AddView(rb);
}

var option = (RadioButton)nativeControl.GetChildAt(Element.SelectedSegment);

var option = (RadioButton)nativeControl.GetChildAt(newElement.SelectedSegment);
if (option != null)
option.Checked = true;

SetNativeControl(nativeControl);
}

if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources

if (nativeControl != null)
nativeControl.CheckedChange -= NativeControl_ValueChanged;
}

if (e.NewElement != null)
{
// Configure the control and subscribe to event handlers

nativeControl.CheckedChange += NativeControl_ValueChanged;
}
}

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
void Child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (nativeControl == null || Element == null) return;

var option = (SegmentedControl.FormsPlugin.Abstractions.SegmentedControlOption)sender;
switch (e.PropertyName)
{
case nameof(SegmentedControl.FormsPlugin.Abstractions.SegmentedControlOption.Text):
var index = Element.Children.IndexOf(option);
if (index >= 0)
{
var radioButton = (RadioButton)nativeControl.GetChildAt(index);
if (radioButton != null)
radioButton.Text = option.Text;
}
break;
}
}

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using SegmentedControl.FormsPlugin.iOS;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using System.ComponentModel;
using SegmentedControl.FormsPlugin.Abstractions;

[assembly: ExportRenderer(typeof(SegmentedControl.FormsPlugin.Abstractions.SegmentedControl), typeof(SegmentedControlRenderer))]
namespace SegmentedControl.FormsPlugin.iOS
Expand All @@ -24,38 +26,66 @@ protected override void OnElementChanged(ElementChangedEventArgs<Abstractions.Se
// the SetNativeControl method

nativeControl = new UISegmentedControl();

for (var i = 0; i<Element.Children.Count; i++)
{
nativeControl.InsertSegment(Element.Children[i].Text, i, false);
}

nativeControl.Enabled = Element.IsEnabled;
nativeControl.TintColor = Element.IsEnabled? Element.TintColor.ToUIColor() : Element.DisabledColor.ToUIColor();
SetSelectedTextColor();

nativeControl.SelectedSegment = Element.SelectedSegment;

SetNativeControl(nativeControl);
}

if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources
// Unsubscribe from event handlers and cleanup any resources

var oldElement = e.OldElement;
for (var i = 0; i < oldElement.Children.Count; i++)
{
var child = oldElement.Children[i];
child.PropertyChanged -= Child_PropertyChanged;
}

if (nativeControl != null)
if (nativeControl != null)
nativeControl.ValueChanged -= NativeControl_ValueChanged;
}

if (e.NewElement != null)
{
// Configure the control and subscribe to event handlers
// Configure the control and subscribe to event handlers

nativeControl.ValueChanged += NativeControl_ValueChanged;
var newElement = e.NewElement;
for (var i = 0; i < newElement.Children.Count; i++)
{
var child = newElement.Children[i];
child.PropertyChanged += Child_PropertyChanged;
nativeControl.InsertSegment(child.Text, i, false);
}

nativeControl.Enabled = newElement.IsEnabled;
nativeControl.TintColor = newElement.IsEnabled ? newElement.TintColor.ToUIColor() : newElement.DisabledColor.ToUIColor();
SetSelectedTextColor();

nativeControl.SelectedSegment = newElement.SelectedSegment;

nativeControl.ValueChanged += NativeControl_ValueChanged;
}
}

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
void Child_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (nativeControl == null || Element == null) return;

var option = (SegmentedControlOption)sender;
switch (e.PropertyName)
{
case nameof(SegmentedControlOption.Text):
var index = Element.Children.IndexOf(option);
if (index >= 0)
{
nativeControl.RemoveSegmentAtIndex(index, false);
nativeControl.InsertSegment(option.Text, index, false);
}
break;
}
}


protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);

Expand Down