Как я могу написать собственный рендерер для SfListView, чтобы отключить прокрутку?

Я использую SfListView из-за группировки и других доступных функций. Однако мне нужно отключить прокрутку списка в Android и iOS. Как мне написать собственный рендерер для SfListView? Для форм Xamarin ListView я могу просто расширить класс ListViewRenderer и переопределить метод OnElementChanged.

Кроме того, как я могу экспортировать настраиваемое средство визуализации?

Например, приведенный ниже код будет работать для ListView форм Xamarin (с соответствующими изменениями):

[assembly: ExportRenderer(typeof(SfListViewWithNoScroll), typeof(SfListViewWithNoScrollRenderer))]
namespace MyApp.Mobile.Droid.CustomRenderers
    {
    public class SfListViewWithNoScrollRenderer : //which class do I need to inherit?
    {
        protected override void OnElementChanged(ElementChangedEventArgs<SfListView> e)
        {

            //base.OnElementChanged(e);
            //if (Control != null)
            //{
            //    Control.VerticalScrollBarEnabled = false;
            //}
            //what do I write here?
        }
    }
    }

person b.g    schedule 12.04.2017    source источник


Ответы (2)


Это повлияет на прокрутку ListView, но такое взаимодействие, как выбор, все равно будет работать. Вы не можете просматривать элементы под областью просмотра.

 [assembly: ExportRenderer(typeof(SfListView), typeof(CustomSfListViewRenderer))]
    namespace XamarinSfListViewDemo.Droid
    {
        public class CustomSfListViewRenderer : ViewRenderer<SfListView,Android.Views.View>
        {
            private Xamarin.Forms.ScrollView scroller;

            protected override void OnElementChanged(ElementChangedEventArgs<SfListView> e)
            {
                base.OnElementChanged(e);
                var element = e.NewElement;
                scroller = (Xamarin.Forms.ScrollView)typeof(SfListView).GetField("scrollView", BindingFlags.NonPublic | BindingFlags.Instance)
                    .GetValue(element);
                scroller.InputTransparent = true;
            }
        }
    }

Я не пробовал этот код в iOS, но на 90% он должен работать. Попробуйте и дайте мне знать, поможет ли это!

person Dilmah    schedule 14.04.2017
comment
Дает «исключение нулевой ссылки» в строке scroller = (Xamarin.Forms.ScrollView)typeof(SfListView).GetField("scrollView", BindingFlags.NonPublic) .GetValue(element);. Даже после изменения этой строки на указанную здесь: syncfusion.com/forums/129969/, я получаю ту же ошибку - person b.g; 19.04.2017
comment
scroller = (Xamarin.Forms.ScrollView) typeof (SfListView) .GetField (scrol lView, BindingFlags.NonPublic | BindingFlags.Instance) .GetValue (element); - person Dilmah; 19.04.2017
comment
не могли бы вы взглянуть на этот вопрос: stackoverflow.com/questions/43679889/ - person b.g; 28.04.2017

В SfListView у нас есть свойство «IsScrollBarVisible» для вашего требования «Включить / отключить видимость полосы прокрутки в ListView». Для этого не нужно создавать рендерер. По умолчанию значение свойства IsScrollBarVisible равно true. Вы можете включить / отключить видимость полосы прокрутки для определенных платформ, как показано в примере кода ниже.

<sync:SfListView x:Name="listView" ItemsSource="{Binding BookInfo}"> 
  <sync:SfListView.IsScrollBarVisible> 
    <OnPlatform x:TypeArguments="x:Boolean"> 
      <OnPlatform.Android> 
        <OnIdiom x:TypeArguments="x:Boolean" Phone="false" Tablet="false"/> 
      </OnPlatform.Android> 
      <OnPlatform.iOS> 
        <OnIdiom x:TypeArguments="x:Boolean" Phone="false" Tablet="false"/> 
      </OnPlatform.iOS> 
      <OnPlatform.WinPhone> 
        <OnIdiom x:TypeArguments="x:Boolean" Phone="true" Tablet="true"/> 
      </OnPlatform.WinPhone> 
    </OnPlatform> 
  </sync:SfListView.IsScrollBarVisible> 
</sync:SfListView> 

Но у него есть некоторые ограничения. Из-за некоторых ограничений встроенного средства визуализации ScrollView в Xamarin Forms вы не можете изменить свойство IsScrollBarVisible во время выполнения. Его можно определить только при инициализации SfListView.

person kyuubi    schedule 20.04.2017