Merge branch '4.6.0' into 4.7.0

This commit is contained in:
Rui Marinho 2020-05-08 11:48:43 +01:00
Родитель d289f329a0 1918e77998
Коммит 71a667d745
9 изменённых файлов: 114 добавлений и 66 удалений

Просмотреть файл

@ -151,6 +151,7 @@
<Content Include="Assets\Fonts\OFL.txt" />
<Content Include="bank.png" />
<Content Include="calculator.png" />
<Content Include="cardBackground.png" />
<Content Include="coffee.png" />
<Content Include="cover1.jpg" />
<Content Include="cover1small.jpg" />

Двоичные данные
Xamarin.Forms.ControlGallery.WindowsUniversal/cardBackground.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 520 KiB

Просмотреть файл

@ -10,9 +10,17 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
[Preserve(AllMembers = true)]
public class CarouselItemsGallery : ContentPage
{
public CarouselItemsGallery(bool empty, bool async, bool nativeIndicator)
CarouselItemsGalleryViewModel _viewModel;
bool _setPositionOnAppering;
public CarouselItemsGallery(bool startEmptyCollection = false, bool setCollectionWithAsync = false,
bool useNativeIndicators = false, bool setPositionOnConstructor = false,
bool setPositionOnAppearing = false, bool useScrollAnimated = true)
{
var viewModel = new CarouselItemsGalleryViewModel(empty, async);
_viewModel = new CarouselItemsGalleryViewModel(startEmptyCollection, setCollectionWithAsync);
_setPositionOnAppering = setPositionOnAppearing;
if (setPositionOnConstructor)
_viewModel.CarouselPosition = 3;
Title = $"CarouselView (Indicators)";
@ -39,14 +47,14 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
{
ItemsLayout = itemsLayout,
ItemTemplate = itemTemplate,
IsScrollAnimated = true,
IsScrollAnimated = useScrollAnimated,
IsBounceEnabled = true,
EmptyView = "This is the empty view",
PeekAreaInsets = new Thickness(50),
BindingContext = viewModel
};
carouselView.SetBinding(CarouselView.ItemsSourceProperty, nameof(viewModel.Items));
carouselView.SetBinding(CarouselView.ItemsSourceProperty, nameof(_viewModel.Items));
carouselView.SetBinding(CarouselView.PositionProperty, nameof(_viewModel.CarouselPosition));
var absolute = new AbsoluteLayout();
absolute.Children.Add(carouselView, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
@ -59,7 +67,7 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
IndicatorsShape = IndicatorShape.Square
};
if (!nativeIndicator)
if (!useNativeIndicators)
{
indicators.IndicatorTemplate = new DataTemplate(() =>
{
@ -92,12 +100,12 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
addItemButton.Clicked += (sender, e) =>
{
viewModel.Items.Add(new CarouselData
_viewModel.Items.Add(new CarouselData
{
Color = Color.Red,
Name = $"{viewModel.Items.Count + 1}"
Name = $"{_viewModel.Items.Count + 1}"
});
carouselView.Position = viewModel.Items.Count - 1;
_viewModel.CarouselPosition = _viewModel.Items.Count - 1;
};
var removeItemButton = new Button
@ -107,11 +115,11 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
removeItemButton.Clicked += (sender, e) =>
{
if (viewModel.Items.Any())
viewModel.Items.RemoveAt(viewModel.Items.Count - 1);
if (_viewModel.Items.Any())
_viewModel.Items.RemoveAt(_viewModel.Items.Count - 1);
if (viewModel.Items.Count > 0)
carouselView.Position = viewModel.Items.Count - 1;
if (_viewModel.Items.Count > 0)
_viewModel.CarouselPosition = _viewModel.Items.Count - 1;
};
var clearItemsButton = new Button
@ -121,7 +129,7 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
clearItemsButton.Clicked += (sender, e) =>
{
viewModel.Items.Clear();
_viewModel.Items.Clear();
};
var lbl = new Label();
@ -136,7 +144,15 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
grid.Children.Add(stacklayoutButtons, 0, 1);
Content = grid;
BindingContext = viewModel;
BindingContext = _viewModel;
}
protected override void OnAppearing()
{
if (_viewModel.CarouselPosition != 3)
_viewModel.CarouselPosition = 3;
base.OnAppearing();
}
internal DataTemplate GetCarouselTemplate()
@ -193,6 +209,7 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
public class CarouselItemsGalleryViewModel : BindableObject
{
ObservableCollection<CarouselData> _items;
int _carouselPosition;
public CarouselItemsGalleryViewModel(bool empty, bool async)
{
@ -244,5 +261,15 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
OnPropertyChanged(nameof(Items));
}
}
public int CarouselPosition
{
get => _carouselPosition;
set
{
_carouselPosition = value;
OnPropertyChanged(nameof(CarouselPosition));
}
}
}
}

Просмотреть файл

@ -34,11 +34,11 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
GalleryBuilder.NavButton("CarouselView (XAML, Horizontal)", () =>
new CarouselXamlGallery(), Navigation),
GalleryBuilder.NavButton("CarouselView (Indicators Forms)", () =>
new CarouselItemsGallery(false,false,false), Navigation),
new CarouselItemsGallery(), Navigation),
GalleryBuilder.NavButton("CarouselView (Indicators Default (Native))", () =>
new CarouselItemsGallery(false,false,true), Navigation),
new CarouselItemsGallery(useNativeIndicators: true), Navigation),
GalleryBuilder.NavButton("CarouselView Async", () =>
new CarouselItemsGallery(false,true,true), Navigation),
new CarouselItemsGallery(setCollectionWithAsync:true, useNativeIndicators: true), Navigation),
GalleryBuilder.NavButton("CarouselView Snap", () =>
new CarouselSnapGallery(), Navigation),
GalleryBuilder.NavButton("ObservableCollection and CarouselView", () =>
@ -46,7 +46,13 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
GalleryBuilder.NavButton("CarouselView EmptyView", () =>
new EmptyCarouselGallery(), Navigation),
GalleryBuilder.NavButton("IndicatorView", () =>
new IndicatorCodeGallery(), Navigation)
new IndicatorCodeGallery(), Navigation),
GalleryBuilder.NavButton("CarouselView SetPosition Ctor", () =>
new CarouselItemsGallery(useNativeIndicators: true, setPositionOnConstructor: true), Navigation),
GalleryBuilder.NavButton("CarouselView SetPosition Appearing", () =>
new CarouselItemsGallery(useNativeIndicators: true, setPositionOnAppearing: true), Navigation),
GalleryBuilder.NavButton("CarouselView SetPosition Ctor No Animation", () =>
new CarouselItemsGallery(useNativeIndicators: true, setPositionOnConstructor: true, useScrollAnimated: false), Navigation),
}
}
};

Просмотреть файл

@ -45,7 +45,7 @@ namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselVi
switch (_type)
{
case CarouselXamlSampleType.Peek:
items.Add(new CarouselItem(i, "cardBackground"));
items.Add(new CarouselItem(i, "cardBackground.png"));
break;
default:
items.Add(new CarouselItem(i));

Просмотреть файл

@ -1,4 +1,4 @@
using System.Linq;
using System.Linq;
using NUnit.Framework;
using Xamarin.UITest;
@ -190,14 +190,22 @@ namespace Xamarin.Forms.Core.UITests
void VisitSubGallery(string galleryName, bool enableIndicator = false)
{
App.ScrollUp();
App.ScrollUp();
if (enableIndicator)
App.Tap(t => t.Marked("EnableIndicatorView"));
App.QueryUntilPresent(() =>
{
var query = App.Query(t => t.Marked(galleryName));
if (query.Count() == 0)
{
App.ScrollDown();
return App.Query(t => t.Marked(galleryName));
});
return null;
}
return query;
}, delayInMs: 500);
App.Tap(t => t.Marked(galleryName));
}

Просмотреть файл

@ -62,7 +62,6 @@ namespace Xamarin.Forms.Platform.Android
AddLayoutListener();
UpdateIsSwipeEnabled();
UpdateIsBounceEnabled();
UpdateInitialPosition();
UpdateItemSpacing();
}
@ -131,7 +130,6 @@ namespace Xamarin.Forms.Platform.Android
if (adapter != null)
{
adapter.NotifyItemChanged(_oldPosition);
Carousel.ScrollTo(_oldPosition, position: Xamarin.Forms.ScrollToPosition.Center);
}
base.UpdateItemSpacing();
@ -193,11 +191,14 @@ namespace Xamarin.Forms.Platform.Android
ItemsViewAdapter = new ItemsViewAdapter<ItemsView, IItemsViewSource>(ItemsView,
(view, context) => new SizedItemContentView(Context, GetItemWidth, GetItemHeight));
_gotoPosition = -1;
SwapAdapter(ItemsViewAdapter, false);
if (_oldPosition > 0)
UpdateInitialPosition();
if (ItemsViewAdapter?.ItemsSource is ObservableItemsSource observableItemsSource)
observableItemsSource.CollectionItemsSourceChanged += CollectionItemsSourceChanged;
@ -297,7 +298,10 @@ namespace Xamarin.Forms.Platform.Android
_oldPosition = position;
_gotoPosition = _oldPosition;
SetCurrentItem(_oldPosition);
Carousel.ScrollTo(_oldPosition, position: Xamarin.Forms.ScrollToPosition.Center, animate: Carousel.AnimatePositionChanges);
}
void UpdateVisualStates()
@ -406,7 +410,12 @@ namespace Xamarin.Forms.Platform.Android
var carouselPosition = Carousel.Position;
if (itemCount == 0)
{
//we are trying to set a position but our Collection doesn't have items still
_oldPosition = carouselPosition;
return;
}
if (carouselPosition >= itemCount || carouselPosition < 0)
throw new IndexOutOfRangeException($"Can't set CarouselView to position {carouselPosition}. ItemsSource has {itemCount} items.");
@ -443,9 +452,9 @@ namespace Xamarin.Forms.Platform.Android
{
if (!_initialized)
{
UpdateInitialPosition();
Carousel.Scrolled += CarouselViewScrolled;
UpdateInitialPosition();
_initialized = true;
}

Просмотреть файл

@ -9,7 +9,7 @@ namespace Xamarin.Forms.Platform.iOS
{
protected readonly CarouselView Carousel;
bool _viewInitialized;
bool _initialPositionSet;
List<View> _oldViews;
int _gotoPosition = -1;
@ -33,21 +33,10 @@ namespace Xamarin.Forms.Platform.iOS
return cell;
}
public override void ViewWillLayoutSubviews()
{
base.ViewWillLayoutSubviews();
if (!_viewInitialized)
{
_viewInitialized = true;
UpdateInitialPosition();
}
UpdateVisualStates();
}
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
UpdateInitialPosition();
}
public override void DraggingStarted(UIScrollView scrollView)
@ -65,6 +54,8 @@ namespace Xamarin.Forms.Platform.iOS
UnsubscribeCollectionItemsSourceChanged(ItemsSource);
base.UpdateItemsSource();
SubscribeCollectionItemsSourceChanged(ItemsSource);
_initialPositionSet = false;
UpdateInitialPosition();
}
protected override bool IsHorizontal => (Carousel?.ItemsLayout as ItemsLayout)?.Orientation == ItemsLayoutOrientation.Horizontal;
@ -201,17 +192,17 @@ namespace Xamarin.Forms.Platform.iOS
{
var currentItemPosition = GetIndexForItem(Carousel.CurrentItem).Row;
ScrollToPosition(currentItemPosition, Carousel.Position);
ScrollToPosition(currentItemPosition, Carousel.Position, Carousel.AnimateCurrentItemChanges);
UpdateVisualStates();
}
void ScrollToPosition(int goToPosition, int carouselPosition)
void ScrollToPosition(int goToPosition, int carouselPosition, bool animate, bool forceScroll = false)
{
if (_gotoPosition == -1 && goToPosition != carouselPosition)
if (_gotoPosition == -1 && (goToPosition != carouselPosition || forceScroll))
{
_gotoPosition = goToPosition;
Carousel.ScrollTo(goToPosition, position: Xamarin.Forms.ScrollToPosition.Center, animate: Carousel.AnimateCurrentItemChanges);
Carousel.ScrollTo(goToPosition, position: Xamarin.Forms.ScrollToPosition.Center, animate: animate);
}
}
@ -223,34 +214,38 @@ namespace Xamarin.Forms.Platform.iOS
_gotoPosition = -1;
if (!Carousel.IsDragging)
ScrollToPosition(carouselPosition, currentItemPosition);
ScrollToPosition(carouselPosition, currentItemPosition, Carousel.AnimatePositionChanges);
SetCurrentItem(carouselPosition);
}
void UpdateInitialPosition()
{
if (Carousel.CurrentItem != null)
{
int position = 0;
var itemsCount = ItemsSource?.ItemCount;
var items = Carousel.ItemsSource as IList;
if (itemsCount == 0)
return;
for (int n = 0; n < items?.Count; n++)
if (!_initialPositionSet)
{
if (items[n] == Carousel.CurrentItem)
{
position = n;
break;
}
}
_initialPositionSet = true;
ScrollToPosition(position, Carousel.Position);
int position = Carousel.Position;
var currentItem = Carousel.CurrentItem;
if (currentItem != null)
{
position = ItemsSource.GetIndexForItem(currentItem).Row;
}
else
{
SetCurrentItem(Carousel.Position);
SetCurrentItem(position);
}
if (position > 0)
ScrollToPosition(position, Carousel.Position, Carousel.AnimatePositionChanges, true);
}
UpdateVisualStates();
}
void UpdateVisualStates()

Просмотреть файл

@ -187,6 +187,8 @@ namespace Xamarin.Forms.Platform.iOS
return;
UIPager.Pages = GetMaximumVisible();
UpdateCurrentPage();
}
void UpdateHidesForSinglePage()