目前,我正试图复制带有xamarin表单的android日期选择器,作为对话框形式的用户控件,作为练习目的,因为我真的很讨厌iPhone日期选择器。。。不管怎样,现在一切都很好,我可以选择一天,在几个月之间切换,选择一年,等等。
但现在只有一个小问题我自己解决不了。
日期的起始ui包含年份和所选日期,如
2017年3月22日星期三。二月
如果用户点击年份,则会隐藏日期选择器,并显示包含可用年份的列表视图。这也很好,我的问题是,如果点击显示的年份,我想滚动到所选年份。但这只有在一年中我点击两次才有效。
假设用户点击“2017”,他现在看到的是列表视图,它没有滚动,而是在顶部显示第一个项目。现在,他再次点击“2017”,最后listView滚动到该位置,以便带有“2017”的项目显示在用户的中心。
也许下面的图片可以更好地解释这一点(开始->2017年第一次点击->2017年第二次点击)
我做错什么了吗?有什么我看不见的吗?如果listview本身不可见,可能是高度导致了这种行为吗?
注意:我已经打过电话了
scrollTo
设置
SelectedDate
或在创建实际视图时(即在构造函数中或
OnBindingContextChanged
).
注2:
if(sender == YearLabel)
第一次检查为真,并且
selection
不为null,但与第二次的值相同
XAML的重要组成部分
<StackLayout BackgroundColor="{DynamicResource AccentColor}" Spacing="5" Padding="15" Grid.Row="0">
<Label Text="{Binding SelectedDate, StringFormat='{0:yyyy}', Source={x:Reference this}}" FontSize="Medium" TextColor="LightGray" x:Name="YearLabel">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="OnDateLabelTapped"/>
</Label.GestureRecognizers>
</Label>
<Label Text="{Binding SelectedDate, StringFormat='{0:ddd, d. MMMM}', Source={x:Reference this}" FontSize="Large" TextColor="White" x:Name="DayLabel">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="OnDateLabelTapped"/>
</Label.GestureRecognizers>
</Label>
</StackLayout>
<StackLayout Grid.Row="1">
<StackLayout x:Name="YearPicker" IsVisible="False" HorizontalOptions="FillAndExpand" Spacing="0">
<ListView ItemSelected="OnYearSelected" x:Name="YearList" ItemTemplate="{StaticResource dateDataTemplateSelector}" SeparatorVisibility="None" />
<BoxView HeightRequest="1" HorizontalOptions="FillAndExpand" Color="#efefef" />
</StackLayout>
... other stuff
在代码隐藏中
public ObservableCollection<YearViewModel> Years { get; set; }
public DateTime SelectedDate
{
get { return (DateTime)GetValue(SelectedDateProperty); }
set { SetValue(SelectedDateProperty, value); }
}
private void OnDateLabelTapped(object sender, EventArgs args)
{
if(sender == YearLabel)
{
YearLabel.TextColor = Color.White;
DayLabel.TextColor = Color.LightGray;
YearPicker.IsVisible = true;
DayPicker.IsVisible = false;
var selection = Years.FirstOrDefault(y => y.Date.Year == SelectedDate.Year);
YearList.ScrollTo(selection, ScrollToPosition.Center, true);
}
else if(sender == DayLabel)
{
DayLabel.TextColor = Color.White;
YearLabel.TextColor = Color.LightGray;
DayPicker.IsVisible = true;
YearPicker.IsVisible = false;
}
}
如果您认为更多的代码可能会有所帮助,请让我知道!