Xamarin Xaml 强制更新界面元素



这篇文章已被重写,以更好地适应当前的问题。

我有一个按钮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的建议,我下载并反序列化了Async,从而解决了这个问题(更像是移动了它)。

这工作得很好,但我仍然无法自动更新界面。我有一些标签需要根据 json 文件输出进行更新。标签的值在后台更新,但只有在我与标签交互(即滚动它们所在的滚动视图)后才会在视觉上更新。检查编辑 3 以获取更多详细信息。

编辑3:

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

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

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

最新更新