使用x:Name在后面的代码中访问第二个透视项的子节点在Windows Phone 8.1中返回null

时间:2014-11-06 08:01:06

标签: c# xaml windows-runtime windows-phone-8.1

我有两个PivotPivotItems控件。 XAML标记如下所示:

<Pivot x:Name="myPivot">
    <PivotItem x:Name="pivot_item1" Header="header1">
        <StackPanel x:Name="StackPanel1">
            <TextBlock Text="page1"></TextBlock>
        </StackPanel>
    </PivotItem>
    <PivotItem x:Name="pivot_item2" Header="header2">
        <StackPanel x:Name="StackPanel2">
            <Button  x:Name="TestButton" Content="Test" Click="Button_Click"></Button>
        </StackPanel>
    </PivotItem>
</Pivot>

现在的问题是当我尝试访问后面代码中的各个元素时。例如,在OnNavigated方法中,访问StackPanel1可以正常工作,但访问StackPanel2会返回null。:

StackPanel sp1 = StackPanel1; // OK
StackPanel sp2 = Stackpanel2; // null

通过x:Name访问第二个PivotItem中的任何元素返回null。我认为这可能是因为第二个透视项尚未初始化,所以我在第二个PivotItem中创建了一个Button,并试图通过其点击处理程序中的x:Name来访问它:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button b = TestButton; //null
    Button b2 = (Button)sender; // OK
}

但是这仍然会返回null,但是按钮清楚地初始化了。任何人都可以向我解释这个并建议一个解决方法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您的项目有问题,或者您在另一个容器中有Pivot。枢轴应该是顶级容器。如果它是另一个顶级样式容器的一部分,它不能很好地工作。您还可能需要检查它应该看起来像这样的构造函数

public MainPage()
{
    this.InitializeComponent();   // check here as well to see if it declares every UI element correctly
    this.NavigationCacheMode = NavigationCacheMode.Required;
}

调试的屏幕截图(如您所见,没有空值 - 这是使用您发布的代码)


enter image description here


我建议首先创建一个新的WP8.1运行时项目,看看是否可以重复你的错误。

答案 1 :(得分:0)

我认为您的第二个PivotItem尚未加载且控件不可用。将Loaded事件添加到数据透视表并尝试以下代码:

private void appPivot_LoadedPivotItem(object sender, PivotItemEventArgs e)
{
    if ( e.Item.Name.CompareTo( "pivot_item1" ) == 0 )
    {
        StackPanel sp1 = StackPanel1;
    }
    else
    {
        StackPanel sp2 = StackPanel2;
    }
}