|
I encountered an issue described at "Exception when resizing root window" (http://tooltipservice.codeplex.com/discussions/246428) in a naviration application.
I have a standard Silverlight navigation application. Page1 uses the Advanced ToolTip to display some information for an UI element on the page. After ToolTip was displayed (it is important), I can resize the browser window without any issue. Then I navigate
to a Page2 that does not have any Advanced ToolTip controls. Resize of the browser window causes the following exception:
System.ArgumentException was unhandled by user code
Message=Value does not fall within the expected range.
StackTrace:
v MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData)
v MS.Internal.XcpImports.MethodPack(IntPtr objectPtr, String methodName, Object[] rawData)
v MS.Internal.XcpImports.UIElement_TransformToVisual(UIElement element, UIElement visual)
v System.Windows.UIElement.TransformToVisual(UIElement visual)
v Silverlight.Controls.ToolTips.ToolTipService.GetTranslatedPoints(FrameworkElement frameworkElement)
v Silverlight.Controls.ToolTips.ToolTipService.PerformPlacement(Double horizontalOffset, Double verticalOffset)
v Silverlight.Controls.ToolTips.ToolTipService.OnRootVisualSizeChanged(Object sender, SizeChangedEventArgs e)
v System.Windows.SizeChangedEventHandler.Invoke(Object sender, SizeChangedEventArgs e)
v System.Windows.FrameworkElement.OnSizeChanged(Object sender, SizeChangedEventArgs e)
v MS.Internal.JoltHelper.RaiseEvent(IntPtr target, UInt32 eventId, IntPtr coreEventArgs, UInt32 eventArgsTypeIndex)
InnerException:
Under the debugger I can see where it exactly fails (code based on the change set #63304):
// in ToolTipService::GetTranslatedPoints method, line 437
var generalTransform = frameworkElement.TransformToVisual(null);
// in ToolTipService::PerformPlacement method, line 416
var translatedPoints = GetTranslatedPoints((FrameworkElement)placementTarget);
// in ToolTipService::OnRootVisualSizeChanged method, line 289
PerformPlacement(CurrentToolTip.HorizontalOffset, CurrentToolTip.VerticalOffset);
Please consider a workaround for this issue: to check whether a popup is open at the beginning of the PerformPlacement method. The code looks like this:
private static void PerformPlacement(double horizontalOffset, double verticalOffset)
{
if (!CurrentToolTip.IsOpen)
{
return;
}
...
}
I consider my workaround more like a hack. It would be nice to see a better solution.
|