【问题标题】:Xamarin Xaml force update interface elementsXamarin Xaml 强制更新界面元素
【发布时间】:2019-04-06 12:17:33
【问题描述】:

帖子已被重写以更好地适应当前的问题。

我有一个按钮x:Name="selectVesselButton"。单击按钮时,它会尝试建立与服务器的连接,这需要一两秒钟的时间。最初,我希望按钮在从连接下载和反序列化 json 文件时显示为灰色。

我的旧代码(异步之前,并尝试更新按钮):

// disabling the button to prevent spam clicking.
string buttonText = selectVesselButton.Text;
selectVesselButton.IsEnabled = false;
selectVesselButton.Text = "loading...";

// retrieve data for speed page.
RetrieveData();
// redirect to next info block if build was successfull.
FocusSpeedblock();

// enabling the button again.
selectVesselButton.Text = buttonText;
selectVesselButton.IsEnabled = true;

此代码的问题是按钮视觉效果在 RetrieveData() 完成之前没有更新,完全违背了这样做的目的。这是因为更新接口的代码和下载和反序列化对象的代码都在同一个线程上。

但是,按照 Ivan 的建议,我进行了异步下载和反序列化,从而解决了这个问题(更像是移动了​​它)。

这很好用,但我仍然在自动更新界面时遇到了一些问题。我有一些标签需要根据 json 文件输出进行更新。标签的值在背景上更新,但只有在我与标签交互时才会在视觉上更新(即滚动它们所在的滚动视图)。查看编辑 3 了解更多详情。

编辑 3:

当第二个线程完成后,它应该调用 UpdateSpeedLabels() 并更新一些标签。但是,它们在代码隐藏中更新,而不是立即更新界面。只有当我与这些标签交互时,它们才会更新。

【问题讨论】:

  • 另外请注意,不要将两个问题合二为一,因为您的问题将被删除。
  • 啊,谢谢。我会在一分钟内将问题分成两部分。

标签: xaml button xamarin.forms interface


【解决方案1】:

在 Xamarin 上执行此操作的首选方法是使用数据绑定。当您选择退出时,它仍然是可能的。

您需要确保您的长任务不会在 UI 线程中运行,因为它会阻止它并阻止其更新。您可以使用 Task.Run(() => { your task code }); 来执行此操作。但是,您无法在 Task.Run 中更新您的用户界面,因为它不在 UI 线程上运行,并且会导致应用程序崩溃,因此您需要在 Task.Run 中使用 Device.BeginInvokeOnMainThread(() => { your UI code }); 来处理该部分。

【讨论】:

  • 简而言之:我已将RetrieveData() 更改为Task.Run(() => RetrieveData());(仅此而已)。由于该方法重定向到不同的页面,我似乎根本不需要编辑第一个屏幕(只是让它失去焦点)。请阅读编辑 3(我稍后会添加)以获取更多信息。
  • 添加了编辑。我删除了灰色按钮等,因为它在使用RetrieveData(); async 时会立即重定向。但是,通过这种方式,标签不会自动更新。一旦我与它们交互,它们就会更新(比如滚动它们所在的滚动视图)。我是否需要在后面的方法中使用Device.BeginInvokOnMainThread(() => { your UI code });(见编辑)?
  • 您需要:禁用按钮。运行 Task.Run,​​在 Task.Run 结束时使用 Device.BeginInvokOnMainThread 启用按钮
  • 谢谢!这行得通。我很高兴我不必尝试重新创建stackoverflow.com/questions/37369180/…,这是我最初的思考过程(这就是我在一篇文章中提出两个问题的原因)。我会将最后一段代码添加到主帖中。我还重新编写了整个帖子以适应(旧)新问题。您能否检查一下这是否仍然足够清楚以了解发生了什么?
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2023-01-31
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多