#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. Теперь это будет работать. Пожалуйста, проверьте.