Xamarin表单活动指示符UWP始终运行

Xamarin表单活动指示符UWP始终运行

问题描述:

Xamarin UWP项目中的ActivityIndicator存在问题。指标始终在运行。我必须设置属性IsVisible来隐藏指示器。我想在ActivityIndicator上执行平台特定条件,并且仅在平台为Windows时才设置属性IsVisibleXamarin表单活动指示符UWP始终运行

这是我的尝试:

<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}"/> 

UPDATE

您可以创建CustomActivityIndicator类继承ActivityIndicator。然后在本地客户端项目中为其实施自定义渲染器。更多请参考下面的代码。

CustomActivityIndi​​cator.cs

public class CustomActivityIndicator : ActivityIndicator 
{ 
    public CustomActivityIndicator() 
    { 

    } 

} 

CustomActivityIndi​​catorRenderer.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 hub。

+0

是的,这就是我所做的。但我不想为所有设备使用黑客攻击。我想把这个属性,IsVisible仅限于UWP设备。这可能吗? – user978123

+0

我已经更新了我的答案。请检查。 –