Xamarin Forms ActivityIndi​​cator UWP Always 运行

Xamarin Forms ActivityIndicator UWP Always Running

我在 Xamarin UWP 项目中遇到 ActivityIndicator 问题。该指标始终为 运行。我必须设置 属性 IsVisible 来隐藏指标。我想在 ActivityIndicator 上执行特定于平台的条件,并且仅当平台为 Windows 时才设置 属性 IsVisible

这是我试过的:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MyApp.Views.LoginPage">
<StackLayout Padding="10" Spacing="10">
    <Label Text="User" />
    <Entry Text="{Binding Email}" Placeholder="User" />
    <Label Text="Pass" />
    <Entry Text="{Binding Password}" Placeholder="Pass" />
    <Button Text="Autentificare" />
    <ActivityIndicator IsRunning="{Binding IsBusy}">
        <OnPlatform x:TypeArguments="x:Boolean">
            <On Platform="Windows" Value="IsVisible">{Binding IsBusy}</On>
        </OnPlatform>
    </ActivityIndicator>
</StackLayout>
</ContentPage>

我尝试使用 OnPlatform 属性,但我不知道如何正确使用。有什么想法吗?

我已经测试了您的代码并重现了您的问题。您可以从 source code 中找到原因。

void UpdateIsRunning()
{
Control.ElementOpacity = Element.IsRunning ? Element.Opacity : 0;
}

IsRunning属性只是设置透明度的一个条件 本机 Control 而不是更改 Active 属性 以进行本机控制。但它没有按预期工作。我会将此问题报告给相关团队。目前有一个解决方法。您可以像下面那样将 IsBusy 绑定到 IsVisibleIsRunning

<ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>

更新

您可以创建继承 ActivityIndicatorCustomActivityIndicator class。然后在本机客户端项目中为其实现自定义渲染器。更多请参考以下代码

CustomActivityIndicator.cs

public class CustomActivityIndicator : ActivityIndicator
{
     public CustomActivityIndicator()
     {

     }

}

CustomActivityIndicatorRenderer.cs

[assembly: ExportRenderer(typeof(CustomActivityIndicator), typeof(CustomActivityIndicatorRenderer))]

namespace XamarinActivatorTest.UWP
{
    public class CustomActivityIndicatorRenderer : ActivityIndicatorRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ActivityIndicator> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                UpdateStatus();
            }
        }
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == nameof(Element.IsRunning))
            {
                UpdateStatus();
            }
        }
        private void UpdateStatus()
        {
            Control.ShowPaused = !Element.IsRunning;
            Control.Opacity = Element.IsRunning ? 1 : 0;
        }
    }
}

您可以直接绑定IsRunning 属性。因为 IsRunning属性 的功能已在您的自定义渲染器中更改。

<StackLayout Padding="10" Spacing="10">
    <Button Text="Autentificare"  Clicked="Button_Clicked"/>
    <local:CustomActivityIndicator IsRunning="{Binding IsBusy}" >
    </local:CustomActivityIndicator>
</StackLayout>

我已将 code sample 上传到 git 中心。