我正在使用ListBox充当"导航"酒吧。当用户选择项目(例如:选项)时,不正确地改变帧的来源。但是,我需要选择第一个项目,以使其看起来像该页面处于活动状态。
我将此添加到我的ListBoxItem样式:
<Setter Property="SelectedIndex" Value="0"></Setter>
唯一的问题是,我得到一个Null异常错误:
我如何选择&#34;定义PageContainer(Frame)后ListBox中的Item?我是WPF的新手,但我还是不明白为什么在激发selectedIndex事件之前没有定义Frame。
澄清PageNavigation
是ListBox,PageContainer
是框架。
旁注
我应该:
甚至将ListBox用于多页软件(例如: CCleaner)
使用框架和页面。 (我见过另一种使用Custom的方法 用户控件,但我认为这有点奇怪)
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>
答案 0 :(得分:1)
前几天我恰好阅读了"Initialized vs. Loaded"文章,我认为这可能适用于这个问题。
我认为正在发生的是控件保持PageContainer
和PageNavigation
开始初始化。您从文章中学到的是,所有子元素将在父Initialized
事件被触发之前完成初始化。
文章还指出:
当已经设置了元素的属性时,通常会触发Initialized事件。
话虽如此,我认为您的PageNavigation
在PageContainer
甚至存在之前正在初始化,所以当SelectionChanged
被解雇并且您尝试访问该控件时 - 你得到了NRE。
此外,我在过去曾遇到过问题,SelectionChanged
会在应用启动期间,在初始化期间触发;然后,当我指定SelectedItem/Index
时。我怀疑这也可能是你的问题。
在一天结束时,空测试会阻止NRE,然后只有在PageContainer
存在时才会设置源 - 这也是一种常见做法。
if(this.PageContainer != null)
{
this.PageContainer.Source = new Uri(navigationPath, UriKind.Relative);
}