Xamarin表单活动指示符UWP始终运行
问题描述:
Xamarin UWP项目中的ActivityIndicator
存在问题。指标始终在运行。我必须设置属性IsVisible
来隐藏指示器。我想在ActivityIndicator
上执行平台特定条件,并且仅在平台为Windows时才设置属性IsVisible
。Xamarin表单活动指示符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
绑定到IsVisible
和IsRunning
,如下所示。
<ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>
UPDATE
您可以创建CustomActivityIndicator
类继承ActivityIndicator
。然后在本地客户端项目中为其实施自定义渲染器。更多请参考下面的代码。
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 hub。
是的,这就是我所做的。但我不想为所有设备使用黑客攻击。我想把这个属性,IsVisible仅限于UWP设备。这可能吗? – user978123
我已经更新了我的答案。请检查。 –