Xamarin Forms ActivityIndicator UWP Always 运行
Xamarin Forms ActivityIndicator UWP Always Running
我在 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
属性,但我不知道如何正确使用。有什么想法吗?
我已经测试了您的代码并重现了您的问题。您可以从 source code 中找到原因。
void UpdateIsRunning()
{
Control.ElementOpacity = Element.IsRunning ? Element.Opacity : 0;
}
IsRunning
属性只是设置透明度的一个条件
本机 Control
而不是更改 Active
属性 以进行本机控制。但它没有按预期工作。我会将此问题报告给相关团队。目前有一个解决方法。您可以像下面那样将 IsBusy
绑定到 IsVisible
和 IsRunning
。
<ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>
更新
您可以创建继承 ActivityIndicator
的 CustomActivityIndicator
class。然后在本机客户端项目中为其实现自定义渲染器。更多请参考以下代码
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 中心。
我在 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
属性,但我不知道如何正确使用。有什么想法吗?
我已经测试了您的代码并重现了您的问题。您可以从 source code 中找到原因。
void UpdateIsRunning()
{
Control.ElementOpacity = Element.IsRunning ? Element.Opacity : 0;
}
IsRunning
属性只是设置透明度的一个条件
本机 Control
而不是更改 Active
属性 以进行本机控制。但它没有按预期工作。我会将此问题报告给相关团队。目前有一个解决方法。您可以像下面那样将 IsBusy
绑定到 IsVisible
和 IsRunning
。
<ActivityIndicator IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}"/>
更新
您可以创建继承 ActivityIndicator
的 CustomActivityIndicator
class。然后在本机客户端项目中为其实现自定义渲染器。更多请参考以下代码
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 中心。