Просмотр коллекции, отключающий прокрутку в формах Xamarin

#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; это дало бы вам желаемый результат.

Я надеюсь, что это было полезно! 🙂