【问题标题】:Xamarin Forms Switch toggles block uiXamarin Forms Switch 切换块 ui
【发布时间】:2017-08-17 14:43:52
【问题描述】:

我目前正在尝试实现两个链接的 Switch 元素。 当一个被切换时,另一个被取消切换。

但是当我的事件被触发时,点击的Switch不完成被切换。

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>

后面的代码:

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;
    }

【问题讨论】:

  • 能否也放上HandleWomanToggled事件处理代码?
  • @ParsaKarami 完成 :)
  • 那么当代码运行ManGenderSwitch.IsToggled = false;时,为什么需要if (s.IsToggled)声明?
  • @AkashKava 没有适当的评论。如果我不使用 MVVM 是因为我无法按照规范使用它

标签: c# xamarin xamarin.forms


【解决方案1】:

您可以为两个 Switch 重复使用相同的处理程序,并且由于切换另一个 Switch 将导致其处理程序被调用,您需要禁用它,否则您最终会得到 非结束事件涟漪

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>

删除/重新添加处理程序以中断事件链:

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

或者使用标志来打破事件链:

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;
}

【讨论】:

  • 我会尝试这个并标记为答案,如果它可以工作:)
【解决方案2】:

正如 Parsa 所说,无论 IsToggled 是什么,您的代码都会做同样的事情。

试试这样的:

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;
        }
    }

【讨论】:

  • 你不能这样做,因为你最终会得到一个无休止的事件链,你必须以某种方式打破事件链(暂时删除处理程序或使用标志来打破链)跨度>
猜你喜欢
  • 2015-06-07
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多