【问题标题】:Xamarin Forms Switch with Task带有任务的 Xamarin 表单切换
【发布时间】:2018-11-30 17:05:34
【问题描述】:

所以我是使用 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 文本不会更改为离线。 有什么想法吗?

【问题讨论】:

  • 您正在更改 UI,并且所有 UI 更改都必须在 Main/UIThread 上完成,而您的异步任务可能并非如此。如果您将两个文本更改都包含在 Device.BeginInvokeOnMainThread( ()=>StatLbl.Text = "Online"); 中,它可能会开始工作。

标签: c# for-loop xamarin xamarin.forms


【解决方案1】:

由于您是 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 Docs 找到有关 Switch 的更多信息(和一些示例)。

正如 Jason 所指出的,您应该从 UI 线程修改 UI 属性。颜色、可见性、文本等属性(显示器上的任何更改)都应在Device.BeginInvokeOnMainThread 中完成,如下所示:

Device.BeginInvokeOnMainThread(() => 
{
    StatLbl.Text = "Offline";
});

【讨论】:

    【解决方案2】:

    您需要在 UI 线程上执行 UI 更改

    Device.BeginInvokeOnMainThread(() => {
      StatLbl.Text = "Offline";
    });
    

    【讨论】:

    • 没有迹象表明这发生在非 UI 线程上,并且代码中还有其他问题会导致所描述的行为,请查看我的答案。
    【解决方案3】:

    大部分代码仅在开关打开时执行,您有这一行可以防止在开关打开时更改标签名称:

        if (S1.IsToggled == true)
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多