为什么我的StackPanel不在生成的类中? (的NullReferenceException)

时间:2011-09-05 07:54:16

标签: c# wpf windows xaml

我在调用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;
        }
    }
}

4 个答案:

答案 0 :(得分:1)

我认为checkBox2.IsCheckednull 试试这个:

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