0

Получение странной ссылки на нулевой объект Ошибка при вызове «sliderValue.Content = widthValue», как определено ниже внутри обработчика события ValueChanged слайдера.Ошибка ссылки на странный нулевой объект

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, что странно.

+2

Вы присоединились, чтобы посмотреть, что такое null? –

+3

Ну, 'sliderValue' и' widthSlider' оба не нуль? –

+0

Да. Я обновил исходный вопрос бит инициализации. – Shaku

ответ

4

От того, что вы опубликовали, кажется 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"/> 

EDIT: Ok , Я узнал, в чем проблема: Когда вызывается InitializeComponent(), изменяется значение widthSlider. Это вызывает событие widthSlider_ValueChanged, но поскольку widthSlider инициализирован до sliderValue, sliderValue будет null на этом этапе.

Так в основном, просто добавьте:

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

на мероприятие и все должно быть хорошо.

Я заметил это раньше с WPF и такими событиями. Они будут действительно расскажите, что изменится, когда.

PS: вы действительно должны упомянуть, что исключение происходит до того, как приложение запускается в таких случаях. Это может сэкономить некоторое время.

+0

Я знаю, что я мог бы легко использовать привязку данных, чтобы позаботиться об этом, но я больше склонен выяснить, почему именно это приводит к ошибке Null Object Reference, ради изучения, поскольку у меня никогда не возникала эта ошибка прежде чем в любом другом случае. – Shaku

+0

Я бы сказал, поставил точки останова в вашем методе конструктора, посмотрел на значения там, поставил точки останова в событии изменения и, возможно, посмотрел на панель вывода, он иногда расскажет вам о путаницах WPF. – moritzpflaum

+0

Ahh - имеет смысл.Я не понимал, что был непреднамеренно поднял это событие, прежде чем все закончилось инициализацией. – Shaku

Смежные вопросы