ApplicationBarIconButton 名称引用会导致 NullReferenceException,但并非所有 Windows Phone 7 应用?

ApplicationBarIconButton name reference results in NullReferenceException but not in all Windows Phone 7 apps?

提问人:Robert Oschler 提问时间:10/30/2013 最后编辑:CommunityRobert Oschler 更新时间:10/31/2013 访问量:731

问:

我今天遇到了应用程序栏图标按钮的问题。尽管在主页 XAML 中具有有效的 x:Name 值,但尝试使用分配的名称引用按钮会导致 NullReferenceException。将 IDE 工具提示悬停在名称引用上时,检查时会显示 NULL 值。

我在 SO 上找到了这篇文章,它给了我一个解决方法:

WP7:引用元素时出现 NullReference 异常

但是,我记得在我拥有的另一个项目中,我没有这个问题。在该项目中,名称引用确实具有有效值,并且我能够通过在主页 XAML 中设置的分配的 x:Name 值来访问应用程序栏按钮。这两个项目都以 Windows O/S 7.1 为平台,我看不出相关 XAML 或主页加载逻辑之间有任何不同,这些逻辑可以指示问题的根源。

有谁知道为什么这种情况发生在一个 Windows Phone 7 项目中而不是另一个项目中?

没有 null 引用问题的应用的主页 XAML

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" x:Name="PhoneAppBar" Opacity="0.0">
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.feature.video.rest.png" Text="record"  x:Name="StartRecording" Click="StartRecording_Click" />
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.stop.rest.png" Text="stop" x:Name="StopPlaybackRecording" Click="StopPlaybackRecording_Click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.transport.play.rest.png" Text="play" x:Name="StartPlayback" Click="StartPlayback_Click"  />
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.transport.pause.rest.png" Text="linked" x:Name="PausePlayback" Click="PausePlayback_Click" IsEnabled="False"/>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

存在问题的应用的主页 XAML

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="False">
        <shell:ApplicationBar.Buttons>
            <shell:ApplicationBarIconButton x:Name="btnRecord" Text="record" IconUri="/images/record.png" Click="Record_Click"/>
            <shell:ApplicationBarIconButton x:Name="btnPlay" Text="play" IconUri="/images/play.png" Click="Play_Click" IsEnabled="False"/>
            <shell:ApplicationBarIconButton x:Name="btnStop" Text="stop" IconUri="/images/stop.png" Click="Stop_Click"/>
        </shell:ApplicationBar.Buttons>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
C# XAML Windows-Phone-7 nullReferenceException

评论

0赞 Kevin Gosse 10/31/2013
令人惊讶的是,它不适用于您的新项目,而是它适用于您的其他项目。您确定没有在代码隐藏中放置某种解决方法吗?
0赞 Robert Oschler 10/31/2013
@KooKiz据我所知。工作位来自 MSDN 视频录制示例,我仔细检查了一下,看看是否有任何不同之处。但到目前为止,我什么也找不到。
0赞 Kevin Gosse 10/31/2013
你能以某种方式分享那个应用程序的代码吗?我真的很想了解它是如何工作的

答:

1赞 Lance McCarthy 10/31/2013 #1

x:Name 允许你从该页面上的隐藏代码访问应用栏项。特别是由于 appbar 是一个 shell 对象,不能直接绑定,因此需要使用 x:Name 来访问它的属性。

查看您的代码,给您带来问题的代码没有应用栏的 x:Name。如果尝试引用它,则在查找“PhoneAppBar”时将出现空引用异常

评论

0赞 Robert Oschler 10/31/2013
我只是尝试给应用栏一个名称,但运行时的名称引用解析为 NULL,就像按钮一样。在清理和重建后仍然会发生。
2赞 bitdisaster 10/31/2013 #2

实际上,这是 AppBar 元素的已知问题。您必须通过 AppBar 本身的索引访问按钮。

var  button =  this.ApplicationBar.Buttons[0];