【问题标题】:Xamarin.Forms - Slider not updating on property assignment in iOS, works in AndroidXamarin.Forms - 滑块未更新 iOS 中的属性分配,适用于 Android
【发布时间】:2017-01-24 04:32:27
【问题描述】:

我的 Xamarin.Forms 项目中有一个特定的屏幕。在 XAML 文件中,我创建了一个 Slider 元素,并在后面的代码中访问滑块以更新其值,但 iOS 上的 UI 永远不会改变。在 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;
}

我已确认此方法按预期每秒调用一次,并且进度变量中的值是正确的。当progress 更新为 1 时,从ProgressSlider.Value(由Console.WriteLine() 确定)返回的值会更新为 1,但之后不会更改,即使 progress 继续按预期增长。

同样,此问题仅在 iOS 上,在 Android 上一切正常。

谁能帮帮我?

【问题讨论】:

  • 如果 UpdateCTI 正在由线程计时器执行,则该函数正在辅助线程中执行,请使用 Device.BeginInvokeOnMainThread
  • @Gusman 谢谢,解决了!将此作为答案发布,我会接受。奇怪的是它仍然可以在 Android 上运行...

标签: c# ios xamarin xamarin.ios xamarin.forms


【解决方案1】:

如果您的代码正在线程计时器上执行,那么代码正在辅助线程上执行,并且无法访问 UI。

要在主线程上运行代码,请使用 Device.BeginInvokeOnMainThread:

void UpdateCTI(object sender, ElapsedEventArgs e)
{
     var progress = DependencyService.Get<IAudioPlayer>().GetAudioProgress();
     Device.BeginInvokeOnMainThread (() => ProgressSlider.Value = progress);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2019-09-28
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多