#xamarin #xamarin.forms #scroll #collectionview
#xamarin #xamarin.forms #прокрутка #просмотр коллекции
Вопрос:
Я пытаюсь отключить прокрутку в представлении моей коллекции. Причина, по которой я хочу это сделать, заключается в том, что в моем коде XAML уже есть режим прокрутки. Когда я пытаюсь прокрутить все элементы страницы на странице, элементы представления коллекции также прокручиваются сами, но я этого не хочу.
<ScrollView&&t;
<StackLayout Paddin&="20" Spacin&="20" &&t;
<Frame CornerRadius="15"
Back&roundColor="#A6EDB3"
VerticalOptions="StartAndExpand"
Hei&htRequest="200"
IsClippedToBounds="True"
Paddin&="0" &&t;
<StackLayout Paddin&="10,5,10,5"
Orientation="Horizontal" &&t;
<Ima&e Source="settin&sIcon"
Hei&htRequest="25"
WidthRequest="25"
Aspect="Fill" /&&t;
<Label Text="Filter"
FontSize="Medium"
VerticalTextAli&nment="Center"
VerticalOptions="Center"/&&t;
</StackLayout&&t;
</Frame&&t;
<Label Text="Vocabulary topics" TextColor="black" FontSize="20" FontAttributes="Bold" &&t;</Label&&t;
<CollectionView x:Name="topics" Scrolled="topics_Scrolled" VerticalScrollBarVisibility="Never" &&t;
<CollectionView.ItemTemplate&&t;
<DataTemplate&&t;
<StackLayout Paddin&="0,10,0,10"&&t;
<Frame HasShadow="False"
Hei&htRequest="60"
CornerRadius="15"
Back&roundColor="{Bindin& Back&roundColor}"
HorizontalOptions="Fill" &&t;
<StackLayout Orientation="Horizontal"&&t;
<Frame Back&roundColor="{Bindin& BoxColor}" WidthRequest="40" &&t;</Frame&&t;
<StackLayout&&t;
<Label Text="{Bindin& Name}"&&t;</Label&&t;
</StackLayout&&t;
</StackLayout&&t;
</Frame&&t;
</StackLayout&&t;
</DataTemplate&&t;
</CollectionView.ItemTemplate&&t;
</CollectionView&&t;
</StackLayout&&t;
</ScrollView&&t;
Комментарии:
1. Удалите ScrollView и поместите пользовательский интерфейс над коллекцией в заголовок CollectionView .
Ответ №1:
Наличие двух прокрутек на одной странице — неправильный способ.
Также, если вы просто хотите разместить элементы выше / ниже вашего CollectionView, используйте свойства верхнего / нижнего колонтитулов!!
Например, для текущего дизайна ваш CollectionView мог бы выглядеть примерно так, как показано ниже, и работать так, как вы хотите.
<CollectionView Paddin&="20" x:Name="topics" Scrolled="topics_Scrolled" VerticalScrollBarVisibility="Never" &&t;
<CollectionView.Header&&t;
<StackLayout Spacin&="20" &&t;
<Frame CornerRadius="15"
Back&roundColor="#A6EDB3"
VerticalOptions="StartAndExpand"
Hei&htRequest="200"
IsClippedToBounds="True"
Paddin&="0" &&t;
<StackLayout Paddin&="10,5,10,5"
Orientation="Horizontal" &&t;
<Ima&e Source="settin&sIcon"
Hei&htRequest="25"
WidthRequest="25"
Aspect="Fill" /&&t;
<Label Text="Filter"
FontSize="Medium"
VerticalTextAli&nment="Center"
VerticalOptions="Center"/&&t;
</StackLayout&&t;
</Frame&&t;
<Label Text="Vocabulary topics" TextColor="black" FontSize="20" FontAttributes="Bold" &&t;</Label&&t;
</StackLayout&&t;
</CollectionView.Header&&t;
<CollectionView.ItemTemplate&&t;
<DataTemplate&&t;
<StackLayout Paddin&="0,10,0,10"&&t;
<Frame HasShadow="False"
Hei&htRequest="60"
CornerRadius="15"
Back&roundColor="{Bindin& Back&roundColor}"
HorizontalOptions="Fill" &&t;
<StackLayout Orientation="Horizontal"&&t;
<Frame Back&roundColor="{Bindin& BoxColor}" WidthRequest="40" &&t;</Frame&&t;
<StackLayout&&t;
<Label Text="{Bindin& Name}"&&t;</Label&&t;
</StackLayout&&t;
</StackLayout&&t;
</Frame&&t;
</StackLayout&&t;
</DataTemplate&&t;
</CollectionView.ItemTemplate&&t;
</CollectionView&&t;
Примечание: возможно, вам придется настроить свойства полей и отступов, чтобы они выглядели точно так же. Мой код — это всего лишь пример.
Для получения дополнительной информации о CollectionView проверьте: https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview /
Комментарии:
1. речь идет не об отключении прокрутки
2. @FerencDajka Да, потому что название вводит в заблуждение, как только вы прочтете вопрос, вы поймете!
3. Я полагаю, вы полностью упускаете суть здесь. он хочет иметь возможность прокручивать разделы, как только исчезнет раздел «фильтр». он не хочет, чтобы этот раздел был заголовком представления коллекции
4. @BryceFriha То, что он хотел, было обычной прокруткой, которая прокручивала все фильтры, а затем темы под ними, вот и вся причина, по которой он отметил мой ответ как правильный…
5. @FreakyAli Абсолютно нет. И я предполагаю, что он отметил ваш ответ как правильный, потому что он «выполняет свою работу», но в конечном итоге это не обязательно то, что он хотел.
Ответ №2:
Вы можете использовать InputTransparent
. В вашем случае то, что я бы сделал, было бы обернуть CollectionView в <ContentView&&t;
виде:
<ContentView InputTransparent="True"
x:Name="content"&&t;
<CollectionView ItemsSource="{Bindin& Items}"...&&t;
...
</CollectionView&&t;
</ContentView&&t;
Создайте событие прокрутки для вашего вида прокрутки:
<ScrollView Scrolled="ScrollView_Scrolled"&&t;
...
</ScrollView&&t;
Затем с помощью этого события убедитесь, что InputTransparent переключается в зависимости от положения прокрутки:
private void ScrollView_Scrolled(object sender, ScrolledEventAr&s e)
{
var scrollView = sender as ScrollView;
// Get the hei&ht of your scroll view
var contentSize = scrollView.ContentSize.Hei&ht;
// Get the max position of the scrollview
var maxPos = contentSize - scrollView.Hei&ht;
// Compare it to the current position
if (Convert.ToInt16(e.ScrollY) &&t;= Convert.ToInt16(maxPos))
{
// Switch input transparent value
content.InputTransparent = false;
}
else if (Convert.ToInt16(e.ScrollY) == 0)
{
content.InputTransparent = true;
}
}
Для того, что вы хотите сделать, совершенно нормально использовать два прокручиваемых элемента управления на одной странице. И я не думаю, что <CollectionView.Header&&t;
это дало бы вам желаемый результат.
Я надеюсь, что это было полезно! 🙂