Как удалить «горизонтальную полосу прокрутки» одной или нескольких записей в коллекционном представлении? - PullRequest
0 голосов
/ 01 октября 2019

Я обновил проект Xamarin Forms до 4.2, и я использую CollectionView с записью для каждого шаблона данных. «Проблема» в том, что когда я нажимаю на запись, я получаю странное маленькое подчеркивание под всеми записями в списке.

Честно говоря, я не знаю, откуда взято это подчеркивание!

the underline Здесь вы можете увидеть небольшое серое подчеркивание под "00"

РЕДАКТИРОВАТЬ:

Я обнаружил, что это небольшая горизонтальная полоса прокрутки, здесь я создал другой вид коллекции(да, привязка полностью случайная, но я хочу быстрый пример), и я установил HorizontalScrollBarVisibility = "Никогда", но он все еще отображается (это свойство CollectionView, а не entry ...).

Код:

<StackLayout>
    <CollectionView x:Name="ItemsListView"
                    ItemsSource="{Binding Items}"
                    VerticalOptions="FillAndExpand"
                    HorizontalScrollBarVisibility="Never"
                    ItemsUpdatingScrollMode="KeepScrollOffset">
        <d:CollectionView.ItemsSource>
            <x:Array Type="{x:Type x:String}">
                <x:String>First Item</x:String>
                <x:String>Second Item</x:String>
                <x:String>Third Item</x:String>
                <x:String>Fourth Item</x:String>
                <x:String>Fifth Item</x:String>
                <x:String>Sixth Item</x:String>
            </x:Array>
        </d:CollectionView.ItemsSource>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <StackLayout>
                    <StackLayout Orientation="Horizontal"
                                 BackgroundColor="AntiqueWhite"
                                 Padding="10"
                                 Margin="10">
                        <Entry WidthRequest="50" />
                        <Entry WidthRequest="50" />
                    </StackLayout>
                </StackLayout>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</StackLayout>

collection view with entries

Есть способ его удалить? или хотя бы сделать так, чтобы он появлялся только в выбранной записи?

PS Я думаю, что не упомянул об этом, он появляется только на секунду (при нажатии на запись) и затем исчезает.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Решение Лео великолепно, но, на мой взгляд, это чрезмерное использование CustomRenderers. Это не то, для чего вы используете CustomRenderer.

Эффект более чем достаточен для достижения того, что вы хотите, и его можно использовать для других типов.

Создайте файл NoHorizontScrollbarEffect.cs в вашем общем доступеproject:

namespace YourAppName.Effects 
{
    public class NoHorizontalScrollbarEffect : RoutingEffect
    {
        public NoHorizontalScrollbarEffect() : base($"MyApp.{nameof(NoHorizontalScrollbarEffect)}")
        {
        }
    }
}

Обратите внимание, что «MyApp» выше и ниже должны совпадать, но это может быть любой текст.

Теперь добавьте NoHor HorizontalScrollbarEffect_Android.cs в соответствующий платформенно-зависимый проект:

[assembly: ResolutionGroupName("MyApp")]
[assembly: ExportEffect(typeof(NoHorizontalScrollbarEffect), nameof(NoHorizontalScrollbarEffect))]
namespace YourAppName.Android.Effects
{
    public class NoHorizontalScrollbarEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            Android.Views.View view = this.Control ?? this.Container //Control is null for Layouts
            view.HorizontalScrollBarEnabled = false;
        }

        protected override void OnDetached()
        {
        }
    }
}

И затем вы можете использовать этот эффект на любом элементе XAML, производном от View (включая Entry) после добавления xmlns:effects="clr-namespace:YourAppName.Effects" (пространство имен класса Effect общего проекта) в верхней части страницы:

...
<AnyControl ...>
    ...
    <AnyControl.Effects>
         <effects:NoHorizontalScrollbarEffect />
    </AnyControl.Effects>
</AnyControl>
...
1 голос
/ 02 октября 2019

Вы можете использовать пользовательский рендер для настройки записи, например:

, настраивать запись MyEntry :

public class MyEntry :Entry
{
}

, затем в проекте Android создайте записьrender AndroidEntry :

[assembly: ExportRenderer(typeof(MyEntry), typeof(AndroidEntry))]
namespace App18.Droid
{
  class AndroidEntry:EntryRenderer
   {
     public AndroidEntry(Context context) : base(context)
      {
      }
     protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
      {
          base.OnElementChanged(e);
          if (Control !=null)
           {
             Control.SetSingleLine(true);
             Control.HorizontalScrollBarEnabled = false;
           }
      }
   }
}

, затем в axml используйте вашу пользовательскую запись:

<CollectionView.ItemTemplate>
    <DataTemplate>
       <StackLayout>
         <StackLayout Orientation="Horizontal"
             BackgroundColor="AntiqueWhite"
             Padding="10"
             Margin="10">
            <local:MyEntry WidthRequest="50" />
            <local:MyEntry WidthRequest="50" />
         </StackLayout>
       </StackLayout>
    </DataTemplate>
</CollectionView.ItemTemplate>
...