【问题标题】:Frame is Null when SelectionChanged (ListBox)?SelectionChanged(ListBox)时框架为空?
【发布时间】:2015-03-24 19:54:43
【问题描述】:

我使用 ListBox 作为“导航”栏。当用户选择一个项目(例如:选项)时,将更改框架的来源。但是,我需要选择第一个项目,以便它看起来像该页面处于活动状态。

我将此添加到我的 ListBoxItem 样式中: <Setter Property="SelectedIndex" Value="0"></Setter>

唯一的问题是,我得到一个空异常错误:

在定义 PageContainer (Frame) 之后,如何“选择”ListBox 中的项目?我对 WPF 很陌生,但我仍然不明白为什么在触发 selectedIndex 事件之前没有定义 Frame。

为了澄清,PageNavigation 是 ListBox,PageContainer 是框架。

附注

我应该:

  1. 甚至将 ListBox 用于多页软件(即: CCleaner)

  2. 使用框架和页面。 (我见过另一种使用自定义的方式 用户控制,但我觉得这有点奇怪)

XAML

<Style x:Key="PageNavigation" TargetType="{x:Type ListBox}">
    <!--<Setter Property="SelectedIndex" Value="1"></Setter>-->
    <Setter Property="Background" Value="#eee"></Setter>
    <Setter Property="BorderThickness" Value="0"></Setter>
    <Setter Property="Margin" Value="0"></Setter>
    <Setter Property="FontSize" Value="18"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <Border Name="Border" BorderThickness="0, 0, 1, 0" BorderBrush="Gray" Background="#eee">
                    <ScrollViewer Focusable="false">
                        <StackPanel IsItemsHost="True"></StackPanel>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

主窗口内:

        <ListBox Name="PageNavigation" Style="{StaticResource PageNavigation}" ItemContainerStyle="{StaticResource PageNavigationItem}" SelectionChanged="PageNavigation_SelectionChanged">
            <ListBoxItem Tag="Home.xaml">Home</ListBoxItem>
            <ListBoxItem Tag="TestPage.xaml">Test Page</ListBoxItem>
            <ListBoxItem Tag="OptionsPage.xaml">Options</ListBoxItem>
        </ListBox>

【问题讨论】:

  • @Ganesh 我添加了 XAML。如果有任何问题,或者您需要更多信息,请告诉我。
  • 您是否在 XAML 中先放置 ListBox,然后再放置 Frame?
  • @EliteGamer 只是对赏金的友好 ping ;)
  • @NETscape 没问题。一旦它告诉我我必须等待 6 小时,我就忘记了。哈哈。

标签: c# .net wpf listbox


【解决方案1】:

前几天我碰巧阅读了"Initialized vs. Loaded" 的文章,我认为它可能适用于这个问题。

我认为正在发生的是持有PageContainerPageNavigation 的控件正在开始初始化。您从文章中了解到,所有子元素都将在父 Initialized 事件触发之前完成初始化。

文章还说:

Initialized 事件通常在元素的属性全部设置完毕时触发。

话虽如此,我认为您的PageNavigation 在您的PageContainer 甚至存在之前就已被初始化,因此当SelectionChanged 被触发并且您尝试访问控件时-您将获得NRE。

另外,我过去也遇到过问题,SelectionChanged 会在应用程序启动和初始化期间触发;然后有一次我指定了SelectedItem/Index。我怀疑这也可能是您的问题。

归根结底,null 测试会阻止 NRE,并且只有在存在 PageContainer 时才会设置源 - 这也是一种常见做法。

if(this.PageContainer != null)
{
    this.PageContainer.Source = new Uri(navigationPath, UriKind.Relative);
}

【讨论】:

  • 完美的例子说明了为什么你应该将代码作为文本也包含在内,而不仅仅是屏幕截图:)。即使是带有//Throws NRE here 的文本 sn-p 也会比屏幕截图更好。感谢分配赏金!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多