如何从后端访问StackLayout?

时间:2016-05-03 22:16:07

标签: c# xaml xamarin tabbedpage

我一直在使用Xamarin Forms来开发iOS和Android应用程序。我想访问TabbedPage中的StackLayout,这样我可以在用户更改标签时使其可见或隐藏,但是当我尝试访问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 个答案:

答案 0 :(得分:1)

元素只能在创建它的页面的上下文中访问 - 在本例中是ContentPage。

如果要从ContentPage外部访问它,则需要向公开它的ContentPage添加公共方法或属性。

答案 1 :(得分:1)

您无法使用其名称访问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);
    }   
};

答案 2 :(得分:0)

感谢您的努力。我试了一下,仍然无法访问StackLayouts。我修改了一些我的代码,这有很多帮助,使一切变得更容易:Creating different layouts for each tab