Как получить доступ к StackLayout из бэкэнда?
Я использую Xamarin Forms для разработки приложений для iOS и Android. Я хочу получить доступ к StackLayout, который находится внутри TabbedPage, чтобы я мог сделать его видимым или скрытым, когда пользователь меняет вкладки, но когда я пытаюсь получить доступ к StackLayout, я получаю "Это не существует в текущем контексте". Вот мой код XAML и мой код CS.
CS
using System;
using System.Collections.Generic;
using Xamarin.Forms;
namespace DebuggerTestAndroidIOS
{
public partial class PatientTabPage : TabbedPage
{
public PatientTabPage ()
{
InitializeComponent ();
ItemsSource = PatientDataModel.tabs;
//vitalSignsStack.IsVisible = true;
this.CurrentPageChanged += (object sender, EventArgs e) => {
var i = this.Children.IndexOf(this.CurrentPage);
System.Diagnostics.Debug.WriteLine("Page No:"+i);
if (i == 1){
vitalSignsStack.IsVisible = true;
}
};
}
}
}
XAML
<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DebuggerTestAndroidIOS.PatientTabPage">
<TabbedPage.ItemTemplate>
<DataTemplate>
<ContentPage Title ="{Binding TabName}">
<!--Parent Wrapper layout-->
<StackLayout Orientation="Vertical" BackgroundColor="White">
<StackLayout x:Name="vitalSignsStack" Orientation="Horizontal" IsVisible="false">
<Image Source="VitalSigns.png" HorizontalOptions="Center"/>
</StackLayout>
</StackLayout><!--End parent wrapper-->
</ContentPage>
</DataTemplate>
</TabbedPage.ItemTemplate>
</TabbedPage>
3 ответа
Спасибо за ваши старания. Я попробовал их, так и не смог получить доступ к StackLayouts. Я немного изменил свой код, это очень помогло и упростило все: создание разных макетов для каждой вкладки
Элемент будет доступен только в контексте страницы, которая его создала - в данном случае ContentPage.
Если вы хотите получить доступ к нему из-за пределов ContentPage, вам нужно добавить открытый метод или свойство в ContentPage, которое его предоставляет.
Вы не можете получить доступ к элементу управления внутри DataTemplate с его именем. Проблема в том, что это будет повторяться, и поэтому это имя будет существовать несколько раз, что недопустимо.
Но почему бы вам не создать новую страницу, подобную этой:
public partial class PatientTabContentPage : TabbedPage
{
public PatientTabContentPage ()
{
InitializeComponent ();
}
public HideVitalSignsStack(bool true){
vitalSignsStack.IsVisible = true;
}
}
И измените DataTemplate на
<DataTemplate>
<PatientTabContentPage Title ="{Binding TabName}">
</DataTemplate>
Затем скрыть панель стека с помощью
this.CurrentPageChanged += (object sender, EventArgs e) => {
var page = CurrentPage as PatientTabContentPage;
var i = this.Children.IndexOf(this.CurrentPage);
System.Diagnostics.Debug.WriteLine("Page No:"+i);
if (i == 1){
page.HideVvitalSignsStack(true);
}
};