OrcusZ
OrcusZ

Reputation: 3660

Xamarin Forms Switch toggles block ui

I currently trying to implement two linked Switch element. When one is toggled the other is untoggled.

But when my event is triggered, the clicked Switch do not finish is toggled.

The XAML :

<StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand">
                    <Switch x:Name="WomanGenderSwitch" IsToggled="true"  Toggled="HandleWomanToggled" Scale="0.5">
                    </Switch>
                    <Label FontSize="12" x:Name="WomanSwitchLabel" TextColor="#ddd" VerticalTextAlignment="Center">
                    </Label>
                    <Switch x:Name="ManGenderSwitch" Toggled="HandleManToggled" Scale="0.5">
                    </Switch>
                    <Label FontSize="12" x:Name="ManSwicthLabel" TextColor="#ddd" VerticalTextAlignment="Center">
                    </Label>
                </StackLayout>

Code Behind :

void HandleManToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
        {
            var s = sender as Switch;
            if (s.IsToggled)
                WomanGenderSwitch.IsToggled = false;
            else
                WomanGenderSwitch.IsToggled = false;
        }



  void HandleWomanToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
    {
        var s = sender as Switch;
        if (s.IsToggled)
            ManGenderSwitch.IsToggled = false;
        else
            ManGenderSwitch.IsToggled = false;
    }

Upvotes: 0

Views: 765

Answers (2)

SushiHangover
SushiHangover

Reputation: 74209

You can re-use the same Handler for both Switches and since toggling the other Switch will cause its handler to be invoked you need to disable it otherwise you end up with a non-ending event ripple:

XAML:

<StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand">
    <Switch x:Name="WomanGenderSwitch" IsToggled="true"  Toggled="HandleToggled" Scale="0.5" />
    <Label FontSize="12" x:Name="WomanSwitchLabel" TextColor="#ddd" VerticalTextAlignment="Center" />
    <Switch x:Name="ManGenderSwitch" Toggled="HandleToggled" Scale="0.5" />
    <Label FontSize="12" x:Name="ManSwicthLabel" TextColor="#ddd" VerticalTextAlignment="Center" />
</StackLayout>

Remove/Re-add handler to break event chain:

void HandleToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
{
    var aSwitch = ((sender == WomanGenderSwitch) ? ManGenderSwitch : WomanGenderSwitch);
    aSwitch.Toggled -= HandleToggled;
    aSwitch.IsToggled = !aSwitch.IsToggled;
    aSwitch.Toggled += HandleToggled;
}

Or using a flag to break the event chain:

bool busy;
void HandleToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
{
    if (busy == true) return;
    busy = true;
    var aSwitch = ((sender == WomanGenderSwitch) ? ManGenderSwitch : WomanGenderSwitch);
    aSwitch.IsToggled = !aSwitch.IsToggled;
    busy = false;
}

Upvotes: 3

Steve Chadbourne
Steve Chadbourne

Reputation: 6953

As Parsa said, your code does the same think regardless of IsToggled.

Try something like this:

void HandleManToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
        {
            var s = sender as Switch;
            if (s !=  null)
            {
                WomanGenderSwitch.IsToggled = s.IsToggled == false;
            }
        }



  void HandleWomanToggled(object sender, Xamarin.Forms.ToggledEventArgs e)
    {
        var s = sender as Switch;
        if (s !=  null)
        {
            ManGenderSwitch.IsToggled = s.IsToggled == false;
        }
    }

Upvotes: 0

Related Questions