Переключатель форм Xamarin с заданием - PullRequest
0 голосов
/ 30 ноября 2018

Итак, я новичок в программировании с Xamarin (на самом деле даже с C # tbh)

То, что я пытаюсь достичь, - это задача, которая должна работать, только когда переключатель (называемый S1) переключен.

Моя идея:

public async Task GetCon(){
        for (; ; )
        {
            if (S1.IsToggled == true)
            {
                AI1.IsRunning = true;
                bool CStat = await CrossConnectivity.Current.IsRemoteReachable("https://www.google.ch");
                if (CStat == true)
                {
                    StatLbl.Text = "Online";
                }
                else if (CStat == false)
                {
                    StatLbl.Text = "Offline";
                    break;
                }
            off:;   
            await Task.Delay(3000);
        }

Все работает нормально, но если я снова выключу Switch и сделаю Google недоступным, текст StatLbl не изменится на автономный.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Большая часть кода выполняется только при включенном коммутаторе, у вас есть эта строка, которая не позволяет изменять имя метки, когда коммутатор включен:

    if (S1.IsToggled == true)
0 голосов
/ 30 ноября 2018

Поскольку вы новичок в C #, я удивлен, что никто больше этого не понял, но здесь все идет.

Вместо бесконечного запуска Task и ожидания переключения.переключите, используйте событие Toggled для запуска при изменении состояния переключателя.Как это работает?Когда вы переключаете переключатель, ваша программа автоматически вызывает этот метод.Например:

public MyConstructor()
{
    S1.Toggled += S1_Toggled;
}

void S1_Toggled(object sender, ToggledEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(String.Format("Switch is now {0}", e.Value));
}

Более подробную информацию (и некоторые примеры) для Коммутатора можно найти в документах Xamarin Forms .

As Jason указал, что вы должны изменять свойства пользовательского интерфейса из потока пользовательского интерфейса.Такие свойства, как цвет, видимость, текст и т. Д. (Все, что изменяется на дисплее) должны быть выполнены в Device.BeginInvokeOnMainThread следующим образом:

Device.BeginInvokeOnMainThread(() => 
{
    StatLbl.Text = "Offline";
});
0 голосов
/ 30 ноября 2018

необходимо выполнить изменения пользовательского интерфейса в потоке пользовательского интерфейса

Device.BeginInvokeOnMainThread(() => {
  StatLbl.Text = "Offline";
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...