2011-09-05 54 views
1

我在调用checkBox2_Checked的代码中收到NullReferenceException。异常表示stackPanelListbox为空。它在XAML中声明,并且类似声明的stackPanel不为null。这里有什么问题?为什么我的StackPanel不在生成的类中? (NullReferenceException)

这里的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; 
     } 
    } 
} 

回答

1

当异常被抛出?在窗口启动时,还是在按下CheckBox之后?

如果它在启动时,可能是因为checkBox2_Checked()在initializecompenents()期间被调用,而stackPanelListbox尚未被声明。

+0

在窗口启动过程中发生异常。我不认为事件可能发生在用户真正点击它之前。我会无效检查方法,并与您取回 – jdphenix

+0

这就是它。出于某种原因,Checkbox.Checked会在initializeComponent()期间被触发,而Checkbox.Clicked不会,所以我将其更改为。 – jdphenix

0

尝试从XAML中删除列表框中Grid.Column = 2

1

我认为checkBox2.IsCheckednull
试试这个:

stackPanelListbox.Visibility = (checkBox2.IsChecked ?? false) ? 
           Visibility.Visible : Visibility.Collapsed; 
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> 

这种方法允许你删除的事件处理程序。所以你不会遇到初始化顺序错误。

相关问题