我的 Xamarin.Forms 项目中有一个特定的屏幕。在 XAML 文件中,我创建了一个 Slider 元素,在后面的代码中,我访问了 slider 以更新它的值,但 UI 在 iOS 上从未改变。在 Android 上完美运行。这是相关代码:
XAML
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TnpApp.Forms.AudioPlayer" BackgroundColor="Gray">
<ContentPage.Content>
<StackLayout Orientation="Vertical" Padding="16" >
// ...
<Slider x:Name="ProgressSlider" Minimum="0" Maximum="100"/>
// ...
</StackLayout>
</ContentPage.Content>
</ContentPage>
代码隐藏(一种在指定时间间隔调用以更新 UI 的方法)
void UpdateCTI(object sender, ElapsedEventArgs e)
{
var progress = DependencyService.Get<IAudioPlayer>().GetAudioProgress();
ProgressSlider.Value = progress;
}
我已确认此方法按预期每秒调用一次,并且进度变量中的值是正确的。从 ProgressSlider.Value 返回的值(由 Console.WriteLine() 确定)在 progress 更新为 1 时更新为 1,但不更新在那之后发生变化,即使 progress 继续按预期增长。
同样,此问题仅在 iOS 上出现,在 Android 上一切正常。
有人能帮我吗?
请您参考如下方法:
如果您的代码是在线程计时器上执行的,那么代码是在辅助线程上执行的,它无法访问 UI。
要在主线程上运行代码,请使用 Device.BeginInvokeOnMainThread:
void UpdateCTI(object sender, ElapsedEventArgs e)
{
var progress = DependencyService.Get<IAudioPlayer>().GetAudioProgress();
Device.BeginInvokeOnMainThread (() => ProgressSlider.Value = progress);
}
