SelectedIndex - исключение нулевой ссылки? - PullRequest
3 голосов
/ 05 мая 2011

Я получаю эту ошибку:

System.NullReferenceException was unhandled by user code
  Message=[Arg_NullReferenceException]
Arguments: 
Debugging resource strings are unavailable. Often the key and arguments provide sufficient information to diagnose the problem. See http://go.microsoft.com/fwlink/?linkid=106663&Version=5.0.60401.00&File=mscorlib.dll&Key=Arg_NullReferenceException
  StackTrace:
       at Jantire.DoHomeworkView.TextAlignment_combobox_SelectionChanged(Object sender, SelectionChangedEventArgs e)
       at System.Windows.Controls.Primitives.Selector.OnSelectionChanged(SelectionChangedEventArgs e)
       at System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedItems, List`1 selectedItems)
       at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
       at System.Windows.Controls.Primitives.Selector.OnItemsChanged(NotifyCollectionChangedEventArgs e)
       at System.Windows.Controls.ItemsControl.OnItemCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
       at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
       at System.Windows.Controls.ItemCollection.NotifyCollectionChanged(NotifyCollectionChangedEventArgs e)
       at System.Windows.Controls.ItemCollection.NotifyCollectionReady()
       at System.Windows.Controls.ItemsControl.NotifyAllItemsAdded(IntPtr nativeItemsControl)
  InnerException: 

по коду:

private void TextAlignment_combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //This next line is where error is at
            if (TextAlignment_combobox.SelectedIndex == 0)
            {
                EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty,  TextAlignment.Left);
            }
            if (TextAlignment_combobox.SelectedIndex == 1)
            {
                EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty, TextAlignment.Center);
            }
            if (TextAlignment_combobox.SelectedIndex == 2)
            {
                EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty, TextAlignment.Right);
            }
        }

С XAML:

<ComboBox Width="128" x:Name="TextAlignment_combobox" SelectionChanged="TextAlignment_combobox_SelectionChanged" ToolTipService.ToolTip="Text Alignment">
                <ComboBoxItem Name="LeftAlignment_comboboxitem" Content="Left Alignment" IsSelected="True"/>
                <ComboBoxItem Name="CenterAlignment_comboboxitem" Content="Center Alignment"/>
                <ComboBoxItem Name="RightAlignment_comboboxitem" Content="Right Alignment"/>
            </ComboBox>

Ответы [ 3 ]

5 голосов
/ 05 мая 2011

ОК, я проверил этот сценарий и обнаружил вашу проблему. При первоначальном запуске приложения WPF оно запускается через событие SelectionChanged. Это происходит, как только объект ComboBox создан. Проблема заключается в том, что в вашем приложении WPF ваш ComboBox находится в XAML перед вашим RichTextBox. Это означает, что это событие происходит до того, как будет создан RichTextBox. Таким образом, вы получаете исключительную ссылку Null. У вас есть два варианта. Вы могли бы сгладить ошибку или попытаться определить, существует ли RichTextBox, прежде чем пытаться работать с ним, или вы можете переместить RichTextBox вверх по XAML, чтобы он находился выше вашего ComboBox. Это не имеет ничего общего с размещением формы, но вместо этого с размещением в XAML. Любой из них решит вашу проблему.

0 голосов
/ 05 мая 2011

Либо:

  • TextAlignment_combobox равно нулю (кажется маловероятным)
  • EssayContents_richtextbox равно нулю
  • или EssayContents_richtextbox.Selection равно нулю

Вы должны отладить это и проверять их все до тех пор, пока не найдете что-то нулевое или неуспешное, которое защищает от того, что они каким-то образом равны нулю в вашем коде, например:

private void TextAlignment_combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (EssayContents_richtextbox == null || EssayContents_richtextbox.Selection == null)
    {
        // Handle me, or just
        return;
    }

    if (TextAlignment_combobox.SelectedIndex == 0)
    {
        EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty,  TextAlignment.Left);
    }
    if (TextAlignment_combobox.SelectedIndex == 1)
    {
        EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty, TextAlignment.Center);
    }
    if (TextAlignment_combobox.SelectedIndex == 2)
    {
        EssayContents_richtextbox.Selection.ApplyPropertyValue(Paragraph.TextAlignmentProperty, TextAlignment.Right);
    }
}

Я думаю,что если EssayContents_richtextbox равно нулю, это ошибка в вашем коде - также, глядя на документацию по свойству Selection, кажется, что это, вероятно, будет иметь значение, даже если нет выбора (хотя это явно не говорит, чтоон никогда не вернет ноль)

0 голосов
/ 05 мая 2011

Без лишних подробностей звучит так, что EssayContents_richtextbox имеет значение null.

...