2015-03-27 14 views
11

Ho ricevuto la traccia dello stack riportata di seguito da un cliente. Non so come riprodurre questo. La mia applicazione WPF ha un discreto numero di ComboBox; Non sono sicuro di come determinare quale ComboBox ha avuto esito negativo, data la traccia dello stack di seguito. Qualcun altro ha visto questo? Riesci a interpretare quello che stava succedendo da questa traccia dello stack? Qualche idea?arresto anomalo in ComboBox coerce (non il mio codice)

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) 
+2

Per quello che vale, stavo avendo lo stesso problema oggi e sono riuscito a risolverlo. Stavo usando [SetWidthFromItems] (http://stackoverflow.com/a/4414372/1492977) sulla mia casella combinata. Se ho cancellato la lista e aggiunto nuovi elementi senza chiamare SetWidthFromItems, avrei ricevuto questo errore. Se ho chiamato SetWidthFromItems dopo aver aggiunto gli elementi, l'errore non si è verificato più. –

risposta

6

Ecco il codice (.NET 4.5.2). O o non è un ComboBox o HighlightedElement è nullo.

Personalmente, il mio primo passo sarebbe quello di distribuire i PDB in modo da poter ottenere i numeri di riga nella traccia dello stack.

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; } 
} 
+0

Questo è il codice per cosa? – MyCodeSucks

+0

@MyCodeSucks Il metodo che genera l'eccezione. Guarda la sua traccia dello stack. – Zer0

+0

Quindi dovrebbe essere lui a pubblicarlo. Non appartiene a una risposta. – MyCodeSucks

2

Abbiamo una casella combinata filtrata su misura che abbiamo creato come un controllo utente che eredita dalla casella combinata. Sui computer Windows 10 abbiamo iniziato a ricevere questo errore per i combobox filtrati all'interno di moduli su righe datagrid. Abbiamo un combobox filtrato all'interno di DataGrid.RowDetailsTemplate su un DataGrid.

Per eliminare l'errore, abbiamo annullato questo sottotitolo nella nostra classe Filtered_Combobox.

Protected Overrides Sub OnIsKeyboardFocusWithinChanged(e As DependencyPropertyChangedEventArgs) 
    Try 


    Catch ex As Exception 
    End Try 
End Sub 

Nota: Noi havent mettere qualsiasi codice di override ancora, perché non sembrava di fare nulla (nonostante drastica l'applicazione).

2

Abbiamo avuto il problema simile su alcune versioni di runtime e windows (non ho avuto il tempo di arrivare a un intervallo preciso).

Uno dei nostri comboboxes avevano seguito lo stile

<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> 

E in qualche modo, a volte pasticciato con l'evidenziazione della selezione e ha causato un'eccezione. Forse questo è utile.

1

Che finalmente risolto questo per noi è stato quello di ignorare il fatto che causa il problema:

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 
0

ho ottenuto lo stesso errore con codice simile a quello che maiksaray condiviso. Per me, NullReferenceException su CoerceIsSelectionBoxHighlighted è successo solo su Windows 10, non sulla mia macchina di sviluppo di Windows 7. E 'successo solo la prima volta che la casella combinata è stata cliccata per aprire.

Nel mio caso, mi è stato a livello di codice aprire e chiudere la casella combinata quando la vista caricato:

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; 
} 

stavo facendo questo come la soluzione a un altro problema, descritto qui: http://blog.elgaard.com/2009/09/03/wpf-making-combo-box-items-disabled-also-when-accessed-using-the-keyboard/

L'errore successo dopo DevicesComboBox_DropDownOpened completato. Tuttavia, è successo solo con il codice OnLoaded. Se ho commentato Loaded + = OnLoaded, quindi non ho ricevuto l'errore.

La soluzione per me era semplicemente evitare di aprire e chiudere a livello di codice il ComboBox.

Problemi correlati