We're getting the following NullReferenceException when running our application with .NET 4.6 or 4.6.1 installed (works fine in 4.0) when a certain action is performed:
Stack: bei System.Windows.Interop.HwndHost.BuildWindow(HandleRef hwndParent)
bei System.Windows.Interop.HwndHost.BuildOrReparentWindow()
bei System.Windows.Interop.HwndHost.OnSourceChanged(Object sender, SourceChangedEventArgs e)
bei System.Windows.SourceChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
bei System.Windows.PresentationSource.UpdateSourceOfElement(DependencyObject doTarget, DependencyObject doAncestor, DependencyObject doOldParent)
bei System.Windows.PresentationSource.OnVisualAncestorChanged(DependencyObject uie, AncestorChangedEventArgs e)
bei System.Windows.UIElement.OnVisualAncestorChanged(Object sender, AncestorChangedEventArgs e)
bei System.Windows.Media.Visual.ProcessAncestorChangedNotificationRecursive(DependencyObject e, AncestorChangedEventArgs args)
bei System.Windows.Media.Visual.ProcessAncestorChangedNotificationRecursive(DependencyObject e, AncestorChangedEventArgs args)
bei System.Windows.Media.Visual.ProcessAncestorChangedNotificationRecursive(DependencyObject e, AncestorChangedEventArgs args)
bei System.Windows.Media.Visual.FireOnVisualParentChanged(DependencyObject oldParent)
bei System.Windows.Media.Visual.AddVisualChild(Visual child)
bei System.Windows.FrameworkElement.set_TemplateChild(UIElement value)
bei System.Windows.Controls.ContentPresenter.UseContentTemplate.BuildVisualTree(FrameworkElement container)
bei System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
bei System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
bei System.Windows.FrameworkElement.ApplyTemplate()
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Controls.Border.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Controls.Control.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
bei System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
bei System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
bei System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
bei System.Windows.Controls.Grid.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Controls.Border.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Documents.AdornerDecorator.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.Controls.Control.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
bei System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
bei System.Windows.FrameworkElement.MeasureCore(Size availableSize)
bei System.Windows.UIElement.Measure(Size availableSize)
bei System.Windows.ContextLayoutManager.UpdateLayout()
bei System.Windows.UIElement.UpdateLayout()
Apparently, the issue is near the end of the BuildWindow method:
// PresentationSource can't be null if we get here.
PresentationSource source = PresentationSource.CriticalFromVisual(this, false /* enable2DTo3DTransition */);
Point ptUpperLeft = new Point(rc.left, rc.top);
Point ptLowerRight = new Point(rc.right, rc.bottom);
ptUpperLeft = source.CompositionTarget.TransformFromDevice.Transform(ptUpperLeft);
ptLowerRight = source.CompositionTarget.TransformFromDevice.Transform(ptLowerRight);
_desiredSize = new Size(ptLowerRight.X - ptUpperLeft.X, ptLowerRight.Y - ptUpperLeft.Y);
The "can't be null" assumption seesm to be wrong, because PresentationSource.CriticalFromVisual does in fact return null here. The question though is "why". Or how I would force the presentation source to be something other than "null" before UpdateLayout() is even called.