【问题标题】:Strange Null Object Reference Error奇怪的空对象引用错误
【发布时间】:2013-11-07 02:22:22
【问题描述】:

在滑块的 ValueChanged 事件处理程序内部调用“sliderValue.Content = widthValue”时出现奇怪的空对象引用错误。

XAML:

<Window x:Class="StrangeError.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="166.066" Width="326.351">
<Grid>
    <Slider x:Name="widthSlider" HorizontalAlignment="Left" Margin="6,56,0,0" VerticalAlignment="Top" Width="257" TickFrequency="10" SmallChange="0.01" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" ValueChanged="widthSlider_ValueChanged" Minimum="1"/>

    <Label x:Name="sliderValue" Content="" HorizontalAlignment="Left" Margin="262,50,0,0" VerticalAlignment="Top"/>
</Grid>

代码:

namespace StrangeError
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    int widthValue;

    public MainWindow()
    {
        InitializeComponent();
        widthValue = 1;
        sliderValue.Content = 1;
    }

    private void widthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        widthValue = (int)widthSlider.Value;
        sliderValue.Content = widthValue;
    }
}
}

错误(由调用 sliderValue.Content = widthValue 引发):

Object reference not set to an instance of an object.
System.NullReferenceException was unhandled by user code (...)

但是,如果我将该语句移到另一个事件处理程序中,则一切正常。当我从 ValueChanged 事件中调用它时,它只会引发此错误,这很奇怪。

【问题讨论】:

  • 有没有附上看看什么是null?
  • sliderValuewidthSlider 都是非空的吗?
  • 是的。我用初始化位更新了原始问题。
  • 真的是“奇怪的空对象引用错误”。
  • 您应该发布更多代码,因为我感觉您正在做一些其他奇怪的事情。也许您在加载 UI 之前调用了sliderValue.Content

标签: c# wpf event-handling runtime-error nullreferenceexception


【解决方案1】:

从您发布的内容来看,sliderValue 似乎在某种程度上为空。 鉴于您在构造函数中使用它,我不确定这到底是怎么发生的...... 无论如何,这个示例非常适合您使用 WPF 绑定:

<Slider x:Name="WidthSlider" HorizontalAlignment="Left" Margin="6,56,0,0" VerticalAlignment="Top" Width="257" TickFrequency="10" SmallChange="0.01" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" Minimum="1" />
<Label Content="{Binding ElementName=WidthSlider, Path=Value}" HorizontalAlignment="Left" Margin="262,50,0,0" VerticalAlignment="Top"/>

编辑: 好的,我发现你的问题是: 当调用InitializeComponent() 时,widthSlider 的值会发生变化。 这会触发您的widthSlider_ValueChanged 事件,但由于widthSlidersliderValue 之前初始化,所以此时sliderValue 将是null

所以基本上,只需添加:

if(sliderValue != null)
{
    ...
}

参加您的活动,一切都会好起来的。

我之前在 WPF 和此类事件中注意到了这一点。他们会真的告诉你什么时候会发生什么变化。

PS:您确实应该提到,在此类情况下,异常发生在应用程序启动之前。它可以节省一些时间。

【讨论】:

  • 我知道我可以很容易地使用数据绑定来解决这个问题——但我更倾向于找出为什么这会产生空对象引用错误,为了学习,因为我'在任何其他情况下从未出现过此错误。
  • 我会说在您的构造方法中放置断点,查看那里的值,在更改事件中放置断点,也许查看输出面板,它有时会告诉您有关 WPF 混淆的信息。
  • 啊——有道理。在事情完成初始化之前,我没有意识到我无意中引发了该事件。
  • 不错的答案。为了避免每次更改值时发生这种 if,我在 MainPage() 方法中的 InitializeComponent() 调用之后设置事件。谢谢,这对我有帮助:)
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多