Xamarin.forms Xamarin表单:用于CarouselPage子级的自动滚动
我有4个孩子(第1页、第2页、第3页和第4页)在旋转木马页面中,我需要每3秒钟自动滚动孩子。最初,page1显示在UI上,然后page2->page3->Page4再次从page1开始 我使用OnCurrentPageChanged()和wait Task.Delay(TimeSpan.FromSeconds(3))完成了如下功能::Xamarin.forms Xamarin表单:用于CarouselPage子级的自动滚动,xamarin.forms,carousel,autoscroll,Xamarin.forms,Carousel,Autoscroll,我有4个孩子(第1页、第2页、第3页和第4页)在旋转木马页面中,我需要每3秒钟自动滚动孩子。最初,page1显示在UI上,然后page2->page3->Page4再次从page1开始 我使用OnCurrentPageChanged()和wait Task.Delay(TimeSpan.FromSeconds(3))完成了如下功能:: protected async override void OnCurrentPageChanged() { base.OnCurrentPageChan
protected async override void OnCurrentPageChanged()
{
base.OnCurrentPageChanged();
await Task.Delay(TimeSpan.FromSeconds(3));
int index = Children.IndexOf(CurrentPage);
if (index == 0)
{
CurrentPage = Children[1];
}
else if (index == 1)
{
CurrentPage = Children[2];
}
else if (index == 2)
{
CurrentPage = Children[3];
}
else if (index == 3)
{
CurrentPage = Children[0];
}
}
通过这种方法,自动滚动是成功的
但是如果我在自动滚动之间手动滚动页面,则延迟会减少。突然(不到3秒)下一页显示在屏幕上。如果我手动滑动页面,我需要在页面上等待3秒钟。如何解决此问题?有一个令人兴奋的库CardsView请查看它 它不仅可以解决您的问题,而且您的应用程序看起来也很酷 这里是源项目 选中CarouselSamplexamView中处理所有内容的carousel的SlideShowDuration属性
希望能有所帮助。请不要将传输页面放在
OnCurrentPageChanged
方法中
您可以将其放入页面的构造函数中
public partial class MainPage : CarouselPage
{
bool isStart = true;
public MainPage()
{
InitializeComponent();
Device.StartTimer(new TimeSpan(0, 0, 3), () =>
{
Device.BeginInvokeOnMainThread(() =>
{
int index = Children.IndexOf(CurrentPage);
if (index == 0)
{
CurrentPage = Children[1];
isStart = true;
}
else if (index == 1)
{
CurrentPage = Children[2];
isStart = true;
}
else if (index == 2)
{
CurrentPage = Children[3];
isStart = true;
}
else if (index == 3)
{
CurrentPage = Children[0];
isStart = true;
}
});
return isStart; // runs again, or false to stop
});
}
}
如果您通过滑动来更改页面,则延迟不会减少。
但是,如果您想在刷卡后在页面上等待3秒钟。您必须使用自定义渲染器来实现它。您应该在android中监视viewpager的onTouchEvent
(但我在IOS中找不到解决方案)。这种方式将有卡顿,所以上述方式将更好
[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace CarouselPageDemo.Droid
{
public class CustomCarouselPageRenderer: CarouselPageRenderer
{
public CustomCarouselPageRenderer(Context context) : base(context) {
}
protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
{
base.OnElementChanged(e);
if (this.ChildCount > 0 && this.GetChildAt(0) is ViewPager viewPager)
{
viewPager.Touch -= ViewPagerTouched;
viewPager.Touch += ViewPagerTouched;
}
}
private void ViewPagerTouched(object sender, TouchEventArgs e)
{
MessagingCenter.Send<App, string>(App.Current as App, "OpenPage", "stop");
}
}
}
您需要滚动页面或视图吗?如果您需要滚动视图(通过autoscroll功能用户正在寻找的猜测),那么我发现CarousePage的使用是一种过火的行为。@Nikhileshwar我正在尝试滚动页面,而我的页面是CarouselPageOK的产物。如果我发现任何对你有用的东西,我会在这里发布。
private async void CarouselPage_CurrentPageChanged(object sender, EventArgs e)
{
var tokenSource = new CancellationTokenSource();
await Task.Delay(TimeSpan.FromSeconds(3), tokenSource.Token);
MessagingCenter.Subscribe<App, string>(App.Current, "OpenPage", (snd, arg) =>
{
tokenSource.Cancel();
});
int index = Children.IndexOf(CurrentPage);
if (index == 0)
{
CurrentPage = Children[1];
}
else if (index == 1)
{
CurrentPage = Children[2];
}
else if (index == 2)
{
CurrentPage = Children[3];
}
else if (index == 3)
{
CurrentPage = Children[0];
}
}