Xamarin Xaml强制更新接口元素
该帖子已被重写,以更好地适应当前问题。 我有一个按钮Xamarin Xaml强制更新接口元素,xaml,button,xamarin.forms,interface,Xaml,Button,Xamarin.forms,Interface,该帖子已被重写,以更好地适应当前问题。 我有一个按钮x:Name=“selectVesselButton”。单击按钮后,它会尝试建立到服务器的连接,这需要一两秒钟的时间。最初,我希望按钮在从连接下载和反序列化json文件时变灰 我的旧代码(在异步之前,正在尝试更新按钮): 这段代码的问题是,在RetrieveData()完成之前,按钮的视觉效果不会更新,这完全违背了执行此操作的目的。这是因为更新接口的代码和下载并反序列化对象的代码都在同一个线程上 然而,按照Ivan的建议,我进行了异步下载和反序
x:Name=“selectVesselButton”
。单击按钮后,它会尝试建立到服务器的连接,这需要一两秒钟的时间。最初,我希望按钮在从连接下载和反序列化json文件时变灰
我的旧代码(在异步之前,正在尝试更新按钮):
这段代码的问题是,在RetrieveData()完成之前,按钮的视觉效果不会更新,这完全违背了执行此操作的目的。这是因为更新接口的代码和下载并反序列化对象的代码都在同一个线程上
然而,按照Ivan的建议,我进行了异步下载和反序列化,从而解决了这个问题(更像是移动了它)
这工作得相当好,但是我仍然在自动更新界面时遇到一些问题。我有一些标签需要根据json文件输出进行更新。标签的值在背景上更新,但只有在我与标签交互(即滚动标签所在的滚动视图)后才会在视觉上更新。查看编辑3以了解更多详细信息
编辑3:
当第二个线程完成时,它应该调用UpdateSpeedLabels()并更新一些标签。但是,它们在codebehind中更新,而不立即更新接口。只有当我与这些标签交互时,它们才会更新 在Xamarin上执行此操作的首选方法是使用数据绑定。当你选择退出时,这仍然是可能的
您需要的是确保长任务不会在UI线程中运行,因为它会阻止长任务并阻止其更新。您可以使用
Task.Run(()=>{your Task code})来实现这一点代码>。但是,您无法在任务内更新您的用户界面。请运行,因为它未在UI线程上运行,并且会使应用程序崩溃,因此您需要使用Device.beginInvokeMainThread(()=>{your UI code})代码>内部任务。运行该部分的
。另外请注意,不要同时问两个问题,因为您的问题将被删除。啊,谢谢。我将在一分钟内把问题一分为二。简言之:我已将RetrieveData()
更改为Task.Run(()=>RetrieveData())代码>(没有其他内容)。由于该方法重定向到另一个页面,我似乎根本不需要编辑第一个屏幕(只需将其置于焦点之外)。有关更多信息,请阅读编辑3(我将在稍后添加)。已添加编辑。我删除了灰显按钮等,因为它在使用RetrieveData()时会立即重定向代码>异步。但是,通过这种方式,标签不会自动更新。一旦我与它们交互,它们就会更新(比如滚动它们所在的滚动视图)。我是否需要使用Device.BeginInvokOnMainThread(()=>{your UI code})代码>后面方法中的某个地方(请参见编辑)?您需要:禁用按钮。在任务结束时运行Task.run。使用Device.beginInvokonMainThread运行启用按钮谢谢!这起作用了。我很高兴我没有尝试重新创建,这是我最初的思考过程(这就是为什么我在一篇文章中问了两个问题)。我将把最后一段代码添加到主帖子中。我还重新撰写了整篇文章,以适应(旧的)新问题。你能不能检查一下,这是否还足够清楚,足以理解到底发生了什么?
// 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;