Сбой в ComboBox coerce (не мой код)

Я получил трассировку стека ниже от клиента. Я не знаю, как это воспроизвести. В моем приложении WPF имеется большое количество ComboBox; Я не уверен, как определить, какой ComboBox не удалось выполнить трассировку стека ниже. Кто-нибудь еще видел это? Можете ли вы интерпретировать происходящее из этой трассировки стека? Любые идеи?

System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Windows.Controls.ComboBox.CoerceIsSelectionBoxHighlighted(Object o, Object value)
   at System.Windows.DependencyObject.ProcessCoerceValue(DependencyProperty dp, PropertyMetadata metadata, EntryIndex& entryIndex, Int32& targetIndex, EffectiveValueEntry& newEntry, EffectiveValueEntry& oldEntry, Object& oldValue, Object baseValue, Object controlValue, CoerceValueCallback coerceValueCallback, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, Boolean skipBaseValueChecks)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.CoerceValue(DependencyProperty dp)
   at System.Windows.Controls.ComboBox.OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FocusWithinProperty.FireNotifications(UIElement uie, ContentElement ce, UIElement3D uie3D, Boolean oldValue)
   at System.Windows.ReverseInheritProperty.FirePropertyChangeInAncestry(DependencyObject element, Boolean oldValue, DeferredElementTreeState treeState, Action`2 originChangedAction)
   at System.Windows.ReverseInheritProperty.OnOriginValueChanged(DependencyObject oldOrigin, DependencyObject newOrigin, IList`1 otherOrigins, DeferredElementTreeState& oldTreeState, Action`2 originChangedAction)
   at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
   at System.Windows.Input.KeyboardDevice.PostProcessInput(Object sender, ProcessInputEventArgs e)
   at System.Windows.Input.InputManager.RaiseProcessInputEventHandlers(ProcessInputEventHandler postProcessInput, ProcessInputEventArgs processInputEventArgs)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
   at System.Windows.Interop.HwndKeyboardInputProvider.PossiblyDeactivate(IntPtr hwndFocus)
   at System.Windows.Interop.HwndKeyboardInputProvider.FilterMessage(IntPtr hwnd, WindowMessage message, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

Ответ 1

Вот код (.NET 4.5.2). Либо o не является ComboBox, либо HighlightedElement имеет значение null.

Лично мой первый шаг состоял в том, чтобы распределить PDB, чтобы вы могли получить номера строк в трассировке стека.

private static object CoerceIsSelectionBoxHighlighted(object o, object value)
{
    ComboBox comboBox = (ComboBox)o;
    return (!comboBox.IsDropDownOpen && comboBox.IsKeyboardFocusWithin) ||
           (comboBox.HighlightedInfo != null && comboBox.HighlightedElement.Content == comboBox._clonedElement);
}

private ComboBoxItem HighlightedElement
{
    get { return (_highlightedInfo == null) ? null : _highlightedInfo.Container as ComboBoxItem; }
}

Ответ 2

У нас есть специально отфильтрованный combobox, который мы сделали как usercontrol, который наследуется от combobox. На машинах Windows 10 мы начали получать эту ошибку для фильтрованных comboboxes внутри форм на строках datagrid. У нас есть отфильтрованное поле со списком в DataGrid.RowDetailsTemplate в DataGrid.

Чтобы убрать ошибку, мы переопределили это подразделение внутри нашего класса Filtered_Combobox.

Protected Overrides Sub OnIsKeyboardFocusWithinChanged(e As DependencyPropertyChangedEventArgs)
    Try


    Catch ex As Exception
    End Try
End Sub

Примечание. Мы не добавили какой-либо код в переопределение, потому что он, похоже, ничего не сделал (несмотря на то, что он врезался в приложение).

Ответ 3

У нас была аналогичная проблема для некоторых (не успевших добраться до точного диапазона) версий среды выполнения и окон.

Один из наших списков со списком соответствовал стилю

<ComboBox.Style>
    <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
        <Setter Property="IsDropDownOpen" Value="False"/>
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="IsDropDownOpen" Value="True" />
                </Trigger>
            </Style.Triggers>
    </Style>

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

Ответ 4

В конечном итоге это разрешило нам переопределить событие, вызвавшее проблему:

Protected Overrides Sub OnIsKeyboardFocusWithinChanged(e As DependencyPropertyChangedEventArgs)
    Try
        'GW 2015-09-20 Added this override to prevent windows 10 crashes on comboboxes within forms within datagrids

    Catch ex As Exception
    End Try
End Sub

Ответ 5

Я получил ту же ошибку с похожим кодом, что и майксарай. Для меня исключение NullReferenceException в CoerceIsSelectionBoxHighlighted произошло только в Windows 10, а не на моей машине Windows 7 dev. Это произошло только в первый раз, когда вы открыли поле со списком.

В моем случае я программным образом открывал и закрывал поле со списком при загрузке представления:

public MyView()
{
    InitializeComponent();
    Loaded += OnLoaded;
}

private void comboBox1_DropDownOpened(object sender, EventArgs e)
{
    comboBox1.ItemsSource = MyClass.GetComboBoxList();
}

private void OnLoaded(object sender, RoutedEventArgs e)
{
   comboBox1.IsDropDownOpen = true;
   comboBox1.IsDropDownOpen = false;
}

Я делал это как обходной путь к другой проблеме, описанной здесь: http://blog.elgaard.com/2009/09/03/wpf-making-combo-box-items-disabled-also-when-accessed-using-the-keyboard/

Ошибка произошла после завершения DevicesComboBox_DropDownOpened. Однако это произошло только с OnLoaded. Если я прокомментировал Loaded + = OnLoaded, то я не получил ошибку.

Решение для меня состояло в том, чтобы просто избежать программного открытия и закрытия ComboBox.