Skip to main content
 首页 » 编程设计

c#之Xamarin.Forms之slider 不更新 iOS 中的属性分配,适用于 Android

2024年02月27日68傻小

我的 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); 
}