Xamarin表单ActivityIndi​​cator UWP始终运行

时间:2017-06-18 13:43:12

标签: xamarin uwp xamarin.forms uwp-xaml

我在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属性,但我不知道如何正确执行此操作。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

<强>更新

您可以创建继承CustomActivityIndicator的{​​{1}}类。然后在本机客户端项目中为它实现自定义渲染器。有关更多信息,请参阅以下代码。

CustomActivityIndi​​cator.cs

ActivityIndicator

<强> CustomActivityIndi​​catorRenderer.cs

public class CustomActivityIndicator : ActivityIndicator
{
     public CustomActivityIndicator()
     {

     }

}

您可以直接绑定[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

我已将code sample上传到git hub。