2017-06-18 20 views
0

Xamarin UWPプロジェクトのActivityIndicatorに問題があります。インジケータは常に動作しています。私は、インジケータを隠すためにプロパティIsVisibleを設定する必要があります。 ActivityIndicatorでプラットフォーム固有の条件を実行し、プラットフォームがWindowsの場合にのみIsVisibleプロパティを設定したいと考えています。XamarinフォームActivityIndi​​cator 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プロパティを使用しようとしましたが、私はそれを正しく行う方法を知りません。何か案が?

答えて

0

私はあなたのコードをテストし、問題を再現しました。原因はsource codeです。

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

IsRunningプロパティのみ ネイティブControlの透明度を設定するのではなく、ネイティブコントロールのActiveプロパティを変更するための条件です。しかし、期待どおりに動作しません。私はこの問題を関連チームに報告します。現在回避策があります。ちょうど以下のようにIsBusyIsVisibleIsRunningにバインドすることができます。

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

UPDATE

あなたはActivityIndicatorを継承CustomActivityIndicatorクラスを作成することができます。ネイティブクライアントプロジェクト内でカスタムレンダラを実装します。詳細については、次のコードを参照してください。

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> 

私はgitのハブにcode sampleをアップロードしました。

+0

はい、これは私がしたものです。しかし、私はすべてのデバイスにハックを使用したくありません。私はこのプロパティを置いて、IsVisibleはUWPデバイスのためだけにしたい。これは可能ですか? – user978123

+0

私は自分の答えを更新しました。チェックしてください。 –

関連する問題