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

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

У меня есть этот код, который я использую:

 [ContentProperty(nameof(InnerContent))]
public partial class ScrollHeadingView : ContentPage
{

    public ScrollHeadingView()
    {
        var outerGrid = new Grid();

        var scrollView = new Xamarin.Forms.ScrollView() { 
           VerticalScrollBarVisibility = ScrollBarVisibility.Always 
        };
        var contentView = new ContentView()
        .Bind(ContentProperty, nameof(InnerContent), source: this);
        scrollView.Content = contentView;
        outerGrid.AddChild(scrollView, 1, 0);
        Content = outerGrid;
    }
}
 

и это:

 [ContentProperty(nameof(InnerContent))]
public partial class HeadingView : ContentPage
{

    public ScrollHeadingView()
    {
        var outerGrid = new Grid();

        var contentView = new ContentView()
        .Bind(ContentProperty, nameof(InnerContent), source: this);
        scrollView.Content = contentView;
        outerGrid.AddChild(contentView, 1, 0);
        Content = outerGrid;
    }
}
 

Есть ли какой-нибудь способ, которым я мог бы объединить их и получить параметр:

 "Scroll = true" or 
"Scroll = false" 
 

с значением по умолчанию true?

Вот как используется класс:

 public partial class DecksTabPage : ScrollHeadingView
{
    public DecksTabViewModel vm;
    public DecksTabPage()
    {
        BindingContext = vm = new DecksTabViewModel();
        InitializeComponent();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        vm.OnAppearing();
    }

}
 

и

 <t:ScrollHeadingView
    x:Class="Views.DecksTab.DecksTabPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:Templates"
    x:Name="ThisPage"
    GearIconTapCommand="{Binding GearTapComd, Mode=OneWay}"
    GearIconVisible="true" >
 

Ответ №1:

Вы могли бы создать связываемые свойства.

Что-то вроде

 public static readonly BindableProperty IsScrollableProperty = BindableProperty.Create (nameof(IsScrollable), typeof(bool), typeof(ScrollHeadingView), null);

public bool IsScrollable
{
    get { return (bool)GetValue(IsScrollableProperty); }
    set { SetValue(IsScrollableProperty, value); }
}
 

затем в вы могли бы установить IsScrollable в своем xaml:

 <t:ScrollHeadingView
   ...
   IsScrollable = True
/>
 

Комментарии:

1. Я ищу немного больше, чем просто привязку, которую я знаю, как сделать. Я думаю, что я хотел бы получить предложение о том, как я мог бы изменить код общедоступного частичного класса HeadingView. Через несколько часов я открою награду за это so. Спасибо

2. Можете ли вы предложить следующий шаг, который заключается в том, как изменить код, чтобы принять и использовать IsScrollable. Я понимаю, что вы добавили его как привязку, однако я не вижу, как внести изменения в свойство scrollable на основе этой привязки.

3. Я предполагаю, что мне нужно привязать IsScrollable к VerticalScrollBarVisibility, но как я могу это сделать. Также я предполагаю, что нет необходимости использовать измененное свойство, и когда я попробовал изменить свойство, оно не сработало, когда в Xaml установлено значение IsScrollable = True. Он срабатывал только в том случае, если я добавлял это в C # после инициализации.

Ответ №2:

 public ScrollHeadingView(bool scroll = true)
{
    if (scroll) {
      ...
    } else { 
      ...
    }
}
 

Комментарии:

1. Я объяснил немного больше в своем вопросе, показав использование. Как я могу указать scroll = true в XAML для этого?

2. если вы хотите сделать это с помощью XAML, вам нужно будет сделать это свойством, а не параметром конструктора

Ответ №3:

Мы можем использовать свойство ориентации ScrollView, чтобы сделать содержимое прокручиваемым. Итак, если мы не хотим прокручивать, мы можем установить Scroll = False, и он будет работать как обычный вид, а когда мы установим Scroll=True, он будет работать как вид прокрутки.

 [ContentProperty(nameof(InnerContent))]
public partial class ScrollHeadingView : ContentPage
{

    ScrollView scrollView;
        public static readonly BindableProperty ScrollProperty = BindableProperty.Create(nameof(Scroll), typeof(bool), typeof(ScrollHeadingView), true,BindingMode.TwoWay, propertyChanged: (obj, oldValue,newValue)=> {
            OnScrollPropertyChange((ScrollHeadingView)obj,(bool)newValue);
        });

        private static void OnScrollPropertyChange(ScrollHeadingView view,bool newValue)
        {
            if (newValue)
        {
            view.scrollView.Orientation = ScrollOrientation.Vertical;
            view.scrollView.VerticalScrollBarVisibility = ScrollBarVisibility.Always;
        }
        else
        {
            view.scrollView.Orientation = ScrollOrientation.Neither;
            view.scrollView.VerticalScrollBarVisibility = ScrollBarVisibility.Never;
        }
        }

        public bool Scroll
        {
            get { return (bool)GetValue(ScrollProperty); }
            set { SetValue(ScrollProperty, value); }
        }

    public ScrollHeadingView()
    {
        var outerGrid = new Grid();

        scrollView = new Xamarin.Forms.ScrollView() { 
           VerticalScrollBarVisibility = ScrollBarVisibility.Always 
        };
        var contentView = new ContentView()
        .Bind(ContentProperty, nameof(InnerContent), source: this);
        scrollView.Content = contentView;
        outerGrid.AddChild(scrollView, 1, 0);
        Content = outerGrid;
    }
}
 

Xaml

 <t:ScrollHeadingView
    x:Class="Views.DecksTab.DecksTabPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:Templates"
    x:Name="ThisPage"
    GearIconTapCommand="{Binding GearTapComd, Mode=OneWay}"
    GearIconVisible="true" 
    Scroll="False">
 

Комментарии:

1. OnScrollPropertyChange срабатывает с Scroll=»False» или Scroll =»True» в XAML. Можете ли вы вместо использования ispropertychanged предложить решение, которое включает привязку к VerticalScrollBarVisibility и устанавливает его на основе IsScrollable?

2. означает, что вы хотите скрыть видимость вертикальной полосы прокрутки при прокрутке =»False»?

3. Да, плюс полностью отключить прокрутку, но через привязку, а не через изменение свойства. Привязка позволяет мне использовать Scroll=»False»> в XAML. Измененное свойство требует от меня ввода кода в Scroll=false после инициализации страницы. Измененное свойство, похоже, не работает, когда Scroll=»False» добавляется в XAML.

4. Прокрутка — это связываемое свойство. Значение свойства Scroll по умолчанию в моем коде было false, поэтому, когда вы устанавливаете Scroll=»False», измененное свойство не срабатывает, потому что значение не изменяется. Теперь я изменил его на True. Теперь это будет работать. Пожалуйста, проверьте.