我在调用checkBox2_Checked的代码中遇到NullReferenceException。该异常表示stackPanelListbox为null。它在XAML中声明,类似声明的stackPanel不为null。这有什么不对?
这是XAML:
<Window x:Class="ch0103.WPF.LayoutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LayoutWindow" Height="450" Width="900">
<StackPanel Name="stackPanelMain">
<WrapPanel>
<CheckBox Name="checkBox1" VerticalAlignment="Center" IsThreeState="False" IsChecked="True" Click="checkBox_Checked" Content="Button StackPanel" Margin="0,0,11,0" />
<CheckBox Content="Listbox StackPanel" Height="16" Name="checkBox2" IsChecked="True" Checked="checkBox2_Checked" />
</WrapPanel>
<Grid Name="grid1" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel HorizontalAlignment="Left" Name="stackPanelButtons" VerticalAlignment="Top" Visibility="Visible">
<Button Content="Button" Height="23" Name="button1" />
<Button Content="Button" Height="23" Name="button2" />
<Button Content="Button" Height="23" Name="button3" />
</StackPanel>
<StackPanel Name="stackPanelListbox" Grid.Column="1">
<ListBox Grid.Column="2" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="200">
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
</ListBox>
</StackPanel>
</Grid>
</StackPanel>
</Window>
这是c#代码:
using System.Windows;
namespace ch0103.WPF
{
/// <summary>
/// Interaction logic for LayoutWindow.xaml
/// </summary>
public partial class LayoutWindow : Window
{
public LayoutWindow() {
InitializeComponent();
}
private void checkBox_Checked(object sender, RoutedEventArgs e) {
stackPanelButtons.Visibility = (bool) checkBox1.IsChecked ?
Visibility.Visible : Visibility.Collapsed;
}
private void checkBox2_Checked(object sender, RoutedEventArgs e) {
stackPanelListbox.Visibility = (bool) checkBox2.IsChecked ? // stackPanelListbox is null here?
Visibility.Visible : Visibility.Collapsed;
}
}
}
答案 0 :(得分:1)
我认为checkBox2.IsChecked
是null
试试这个:
stackPanelListbox.Visibility = (checkBox2.IsChecked ?? false) ?
Visibility.Visible : Visibility.Collapsed;
答案 1 :(得分:1)
抛出异常时?在窗口启动时,或按下CheckBox后?
如果它在启动时,可能是因为checkBox2_Checked()在initializecompenents()期间被调用,而stackPanelListbox尚未声明。
答案 2 :(得分:1)
如果您只想在事件处理程序中隐藏或显示StackPanel,则可以改为使用数据绑定:
<Window x:Class="ch0103.WPF.LayoutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Name="stackPanelMain">
<WrapPanel>
<!-- Note the removed event handlers here: -->
<CheckBox Name="checkBox1" VerticalAlignment="Center" IsThreeState="False" IsChecked="True" Content="Button StackPanel" Margin="0,0,11,0" />
<CheckBox Content="Listbox StackPanel" Height="16" Name="checkBox2" IsChecked="True" IsThreeState="False" />
</WrapPanel>
<Grid Name="grid1" ShowGridLines="True">
<!-- This one is used to convert checkbox state to visibility -->
<Grid.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!-- Additional Binding attributes in both StackPanel elements: -->
<StackPanel HorizontalAlignment="Left" Name="stackPanelButtons" VerticalAlignment="Top" Visibility="{Binding IsChecked, ElementName=checkBox1, Converter={StaticResource BoolToVisConverter}}">
<Button Content="Button" Height="23" Name="button1" />
<Button Content="Button" Height="23" Name="button2" />
</StackPanel>
<StackPanel Name="stackPanelListbox" Grid.Column="1" Visibility="{Binding IsChecked, ElementName=checkBox2, Converter={StaticResource BoolToVisConverter}}">
<ListBox HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="200">
<ListBoxItem Content="Test" />
<ListBoxItem Content="Test" />
</ListBox>
</StackPanel>
</Grid>
</StackPanel>
</Window>
此方法允许您删除事件处理程序。所以你不会遇到初始化顺序错误。
答案 3 :(得分:0)
尝试从ListBox中的xaml中删除Grid.Column = 2
。