gpt4 book ai didi

xamarin - 为什么当我单击按钮时事件指示器需要近 3 秒才能启动

转载 作者:行者123 更新时间:2023-12-02 10:36:15 26 4
gpt4 key购买 nike

我在单独的 xaml 文件中有 ActivityIndi​​cator 。我在 MainPage xaml 中将其用作 CustomLoader。此 CustomLoader 可见性由 bool 变量 VisibleLoader

控制
<custom:CustomLoader IsVisible="{Binding VisibleLoader}" 
AbsoluteLayout.LayoutBounds="0.5,0.5,1,1"
AbsoluteLayout.LayoutFlags="All" Grid.Row="2">
</custom:CustomLoader>

MainPageViewModel中,当我单击声明ActivityIndi​​cator的按钮时,它需要一些时间才能启动。请参阅下面的代码

MainPageViewModel代码

private bool _visibleLoader = false;
public MainPageViewModel()
{
VisibleLoader = true;
current = this;
GetAllProducts();
SyncCommand = new Command(SyncDevice);
}

public bool VisibleLoader
{
get
{
return _visibleLoader;
}
set
{
this._visibleLoader = value;
NotifyPropertyChanged("VisibleLoader");
}
}

按钮点击事件代码

public async void SyncDevice()
{
try
{
VisibleLoader = true;
IsBusy = true;
PageMessage = string.Empty;
var strSerialNumber = DependencyService.Get<IDataHelper>().GetIdentifier();
//VisibleButtons = true;
resourceService = new ResourceService(new RequestProvider());
if (GlobalSettings.deviceId == 0)
{
DeviceDetails deviceDtls = await resourceService.GetDeviceDetails(strSerialNumber);
GlobalSettings.deviceId = deviceDtls.Id.Value;
}
if (GlobalSettings.deviceId.ToString() != null)
{
DevicesList data = await resourceService.GetProducts(GlobalSettings.deviceId);
//this.lstProducts = data.Devices[0].Products;
this.lstProducts = data != null ? data.Devices[0].Products : null;
if (lstProducts != null && lstProducts.Count != 0)
{
//Filter Products from Parameter file
var filterProducts = GlobalSettings.GetFilterProducts();
if (filterProducts.Count > 0)
{
//lstProducts = lstProducts.Where(product => !filterProducts.Any(fp => product.Name.ToLowerInvariant().Contains(fp.ToLowerInvariant()))).ToList();
lstProducts = lstProducts.Where(product => filterProducts.Any(fp => product.Name.ToLowerInvariant().Contains(fp.ToLowerInvariant()))).ToList();
}
TotalProducts = lstProducts.Count;
lstProducts = lstProducts.OrderBy(s => s.Order).ThenBy(s => s.Name).ToList();
}
else
{
PageMessage = "No products found.";
}
}
else
{
PageMessage = "Error occured. Please try again later.!";
}
NotifyPropertyChanged("lstProducts");
resourceService = new ResourceService(new RequestProvider());
await resourceService.SyncDevice(GlobalSettings.deviceId);
}
catch (Exception)
{
VisibleLoader = false;
}
VisibleLoader = false;
IsBusy = false;
}
}

xaml 文件中的按钮

 <Button Text="Sync device" Command="{Binding SyncCommand}" HorizontalOptions="FillAndExpand"
BackgroundColor="LightBlue" Margin="5" TextColor="White" BorderRadius="10" HeightRequest="40"></Button>

如何解决这个问题?

最佳答案

首先,如果您的同步设备方法不是一个事件,我建议您将其作为一个任务,因为异步空洞不是一个好的做法。

public async Task SyncDevice()

另外,可能是你的 bool 值在主线程中没有改变,这反过来又导致了这种情况,所以尝试类似的方法

Device.BeginInvokeOnMainThread(()=>{ //Change visibility... });

确保仅在此处添加相关代码,因为这会阻塞主线程,进而导致 UI 卡住

更新

那么你的命令将类似于:

new Command(async ()=>{await SyncDevice()});

关于xamarin - 为什么当我单击按钮时事件指示器需要近 3 秒才能启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57653959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com