Xamarin формирует события переключения, приводящие к бесконечному циклу - групповые переключатели - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь разработать приложение, используя Xamarin.Forms. В определенный момент я пытаюсь иметь несколько переключателей, которые сгруппированы. Это означает, что когда один переключатель переключается, каждый второй переключатель должен быть выключен, и в то же время всегда должен быть хотя бы один переключатель. Это означает, что нажатие на переключатель, который уже переключен, не должно ничего менять. T

Теперь моя проблема заключается в том, что событие Xamarin.forms Toggled для переключателей может быть запущено из пользовательского интерфейса, но также запускается программно. Я думал, что нашел способ обойти эту проблему, но все же выполнил: -Если переключатель включен, выключите все остальные и сделайте что-нибудь для приложения. - иначе, если выключатель был выключен, проверьте, есть ли другие, которые включены. Если нет, включите переключатель снова. Если да, ничего не делать.

Пример кода для двух коммутаторов может быть следующим:

private void OnFirstToggled(object sender, EventArgs args)
{
   if(FirstSwitch.isToggled)
  {
     //Application stuff.
     SecondSwitch.isToggled = false;
  }
  else if (!SecondSwitch.isToggled)
  {
      FirstSwitch.isToggled = true;
  }
}

private void OnSecondToggled(object sender, EventArgs args)
{
   if(SecondSwitch.isToggled)
  {
     //Application stuff.
     FirstSwitch.isToggled = false;
  }
  else if (!FirstSwitch.isToggled)
  {
      SecondSwitch.isToggled = true;
  }
}

Это решение приводит к бесконечному циклу при касании уже переключенного переключателя. Фактически, свойство isToggled переключателя чередуется между истиной и ложью бесконечно. Однако при отладке другое событие никогда не запускается (или, по крайней мере, мой отладчик его не видит). Вот почему я не понимаю, где свойство isToggled изменяется после первого нажатия.

Я знаю, что это, вероятно, очень простая проблема, но я не могу найти решение где-нибудь в Интернете. Кто-нибудь может увидеть проблему или порекомендовать лучший общий способ ее реализации?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Я пишу вам простое решение, чтобы всегда держать один Switch открытым из группы Switch.

Давайте сначала добавим три переключателя для теста, убедитесь, что эти Switch вызовут одно и то же событие Toggled :

<StackLayout>
    <!-- Place new controls here -->
    <Switch Toggled="Switch_Toggled" x:Name="FirstSwitch"/>
    <Switch Toggled="Switch_Toggled" x:Name="SecondSwitch"/>
    <Switch Toggled="Switch_Toggled" x:Name="ThirdSwitch"/>

</StackLayout>

В приведенном ниже коде я добавляюэти Коммутаторы в список, и зациклите их в событии Switch_Toggled, чтобы открыть / закрыть Коммутаторы:

public partial class MainPage : ContentPage
{

    List<Switch> switchList;// To store all your Switches

    bool isLooping; //To make sure the Switch_Toggled metod not fired a second time during one toogle event

    public MainPage()
    {
        InitializeComponent();

        switchList = new List<Switch>();

        switchList.Add(FirstSwitch);
        switchList.Add(SecondSwitch);
        switchList.Add(ThirdSwitch);


        isLooping = false;
    }

    private void Switch_Toggled(object sender, ToggledEventArgs e)
    {
        //To make sure the Switch_Toggled metod not fired a second time during one toogle event
        if (isLooping == true)
        {
            return;
        }

        isLooping = true;

        Switch clickSwitch = sender as Switch;
        clickSwitch.IsToggled = true;

        foreach (var tempSwitch in switchList)
        {
            if (tempSwitch != clickSwitch)
            {
                if (tempSwitch.IsToggled == true)
                {
                    tempSwitch.IsToggled = false;
                }
            }
        }

        isLooping = false;
    }    
}

Вы можете попробовать это решение и не стесняйтесь задавать мне любые вопросы, если вы не понимаете.

0 голосов
/ 14 октября 2019

Ваша проблема - два других блока. Примите во внимание, что вы все равно включаете его ...

Приветствия,

...