我在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
属性,但我不知道如何正确执行此操作。有什么想法吗?
答案 0 :(得分:0)
我已经测试了您的代码并重现了您的问题。你可以从source code找到原因。
void UpdateIsRunning()
{
Control.ElementOpacity = Element.IsRunning ? Element.Opacity : 0;
}
IsRunning
属性只是设置透明度的条件
本机Control
而不是更改本地控件的Active
属性。但它没有按预期工作。我会将此问题报告给相关团队。目前有一种解决方法。您可以将IsBusy
绑定到IsVisible
和IsRunning
,如下所示。
<ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>
<强>更新强>
您可以创建继承CustomActivityIndicator
的{{1}}类。然后在本机客户端项目中为它实现自定义渲染器。有关更多信息,请参阅以下代码。
CustomActivityIndicator.cs
ActivityIndicator
<强> CustomActivityIndicatorRenderer.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。