在 Xamarin 中自动向下滚动 ListView
Automatically scroll down ListView in Xamarin
我有 ListView
绑定 ItemsSource
(它是 ObservableRangeCollection
)。我想在页面出现时自动向下滚动 ListView
。我该怎么办?
是 View
:
<ListView
x:Name="ListAdd"
ItemsSource="{Binding AddNewFlashcard}"
(...)
>
<ListView.Behaviors>
<(...)>
</ListView.Behaviors>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Flashcard">
<ViewCell>
<Grid Padding="10">
<Frame CornerRadius="20" HasShadow="True">
<StackLayout VerticalOptions="Center">
<Label FontSize="Large"
Text="{Binding Word}"
VerticalOptions="Center"/>
<Label Text="{Binding Sentence}"
VerticalOptions="Center"/>
</StackLayout>
</Frame>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
它是 ViewModel:
public ObservableRangeCollection<Flashcard> AddNewFlashcard { get; set; }
public NewFlashcardVM()
{
Refresh();
AddNewFlashcard = new ObservableRangeCollection<Flashcard>();
}
public async void Refresh()
{
IsBusy = true;
var flashcards = await FlashcardService.GetFlashcard();
AddNewFlashcard.AddRange(flashcards);
IsBusy = false;
}
你可以在ListView中调用ScrollTo方法达到你想要的效果
我写了一个小例子供大家参考。
这里是 xaml 代码:
<StackLayout>
<Frame HeightRequest="100">
<ListView x:Name="mytest" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding .}"></Label>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Frame>
</StackLayout>
这里是后台代码(加载数据时,在OnAppearing方法中调用ListView的ScrollTo方法):
public partial class MainPage : ContentPage
{
ObservableRangeCollection<string> myList;
public MainPage()
{
InitializeComponent();
myList = new ObservableRangeCollection<string>();
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("bbb");
mytest.ItemsSource = myList;
BindingContext = this;
}
protected override void OnAppearing()
{
base.OnAppearing();
mytest.ScrollTo(myList[myList.Count-1], ScrollToPosition.End,false);
}
}
如果把ScrollTo的最后一个参数改成true,就会出现滑动动画发生。
我有 ListView
绑定 ItemsSource
(它是 ObservableRangeCollection
)。我想在页面出现时自动向下滚动 ListView
。我该怎么办?
是 View
:
<ListView
x:Name="ListAdd"
ItemsSource="{Binding AddNewFlashcard}"
(...)
>
<ListView.Behaviors>
<(...)>
</ListView.Behaviors>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Flashcard">
<ViewCell>
<Grid Padding="10">
<Frame CornerRadius="20" HasShadow="True">
<StackLayout VerticalOptions="Center">
<Label FontSize="Large"
Text="{Binding Word}"
VerticalOptions="Center"/>
<Label Text="{Binding Sentence}"
VerticalOptions="Center"/>
</StackLayout>
</Frame>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
它是 ViewModel:
public ObservableRangeCollection<Flashcard> AddNewFlashcard { get; set; }
public NewFlashcardVM()
{
Refresh();
AddNewFlashcard = new ObservableRangeCollection<Flashcard>();
}
public async void Refresh()
{
IsBusy = true;
var flashcards = await FlashcardService.GetFlashcard();
AddNewFlashcard.AddRange(flashcards);
IsBusy = false;
}
你可以在ListView中调用ScrollTo方法达到你想要的效果
我写了一个小例子供大家参考。
这里是 xaml 代码:
<StackLayout>
<Frame HeightRequest="100">
<ListView x:Name="mytest" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding .}"></Label>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Frame>
</StackLayout>
这里是后台代码(加载数据时,在OnAppearing方法中调用ListView的ScrollTo方法):
public partial class MainPage : ContentPage
{
ObservableRangeCollection<string> myList;
public MainPage()
{
InitializeComponent();
myList = new ObservableRangeCollection<string>();
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("aaa");
myList.Add("bbb");
mytest.ItemsSource = myList;
BindingContext = this;
}
protected override void OnAppearing()
{
base.OnAppearing();
mytest.ScrollTo(myList[myList.Count-1], ScrollToPosition.End,false);
}
}
如果把ScrollTo的最后一个参数改成true,就会出现滑动动画发生。