如果发生以下异常,如何调试可视树

时间:2013-09-02 14:42:53

标签: wpf debugging visual-studio-debugging visual-tree

如何调试以下错误?

Must disconnect specified child from current parent Visual before attaching to new parent Visual.

我确定我明白这个Exception的含义,但如果我错过了一些重要的东西,我认为这意味着

基于FrameworkElement的对象已经存在于可视树中的某个地方,我尝试在树中的其他地方再次添加它来解决我有2个选项

  1. 将其从视觉树中的当前位置移除
  2. 或者我可以根据我的实现来克隆它。
  3. 到目前为止一直很好,但为什么Exception没有告诉我需要修改哪种类型的孩子?因为如果您尝试使用的对象包含多个子对象,则必须在每个类中查找可以找到抛出此Exception的对象。

    所以有一种简单的方法来挖掘对象因为我认为堆栈轨道不是真的有用吗?

    编辑:

    这里是堆栈轨道

    UnhandledException=System.ArgumentException: Das angegebene untergeordnete Element muss vom aktuellen übergeordneten Visual-Objekt getrennt werden, bevor es an ein neues übergeordnetes Visual-Objekt angefügt wird.
       bei System.Windows.Media.Visual.AddVisualChild(Visual child)
       bei MS.Internal.Documents.FlowDocumentView.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.ScrollContentPresenter.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
       bei System.Windows.Controls.ScrollViewer.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.StackPanel.StackArrangeHelper(IStackMeasure arrangeElement, IStackMeasureScrollData scrollData, Size arrangeSize)
       bei System.Windows.Controls.StackPanel.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
       bei System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
       bei System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
       bei System.Windows.Controls.DataGridCell.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
       bei System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
       bei System.Windows.UIElement.Arrange(Rect finalRect)
       bei System.Windows.ContextLayoutManager.UpdateLayout()
       bei System.Windows.UIElement.UpdateLayout()
       bei System.Windows.Interop.HwndSource.SetLayoutSize()
       bei System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
       bei System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
       bei System.Windows.Window.SetRootVisual()
       bei System.Windows.Window.SetRootVisualAndUpdateSTC()
       bei System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
       bei System.Windows.Window.CreateSourceWindow(Boolean duringShow)
       bei System.Windows.Window.CreateSourceWindowDuringShow()
       bei System.Windows.Window.SafeCreateWindowDuringShow()
       bei System.Windows.Window.ShowHelper(Object booleanBox)
       bei System.Windows.Window.Show()
       bei System.Windows.Window.ShowDialog()
       bei Speiseplandienst.ViewModels.BestellscheinUebersichtListVM.OnEdit() in C:\_\_\_\_\_\_\_\BestellscheinUebersichtListVM.cs:Zeile 30.
       bei Framework.ListVM.Edit() in C:\_\_\_\_\_\_\Controls\ListVM.cs:Zeile 118.
       bei Framework.ListVM.<get_EditCommand>b__8(Object param) in C:\_\_\_\_\_\_\Controls\ListVM.cs:Zeile 101.
       bei Framework.RelayCommand.Execute(Object parameter) in C:\_\_\_\Framework\Tools\RelayCommand.cs:Zeile 132.
       bei MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated)
       bei System.Windows.Controls.Primitives.ButtonBase.OnClick()
       bei System.Windows.Controls.Button.OnClick()
       bei System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       bei System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       bei System.Windows.Input.MouseButtonEventArgs.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.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       bei System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       bei System.Windows.Input.MouseButtonEventArgs.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.RaiseTrustedEvent(RoutedEventArgs args)
       bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       bei System.Windows.Input.InputManager.ProcessStagingArea()
       bei System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       bei System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       bei System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       bei System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       bei System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       bei System.Windows.Threading.Dispatcher.Run()
       bei System.Windows.Application.RunDispatcher(Object ignore)
       bei System.Windows.Application.RunInternal(Window window)
       bei System.Windows.Application.Run(Window window)
       bei System.Windows.Application.Run()
       bei Speiseplandienst.MainRun.Main(String[] args) in C:\_\_\_\_\_\_\Main.cs:Zeile 18.
    

2 个答案:

答案 0 :(得分:1)

此错误可能有许多不同的原因。例如,如果尝试多次将相同的Visual对象添加到UI集合控件中,则会发生此错误。如果您尝试将所选项目(UI对象)从一个ListBox添加到另一个{而不是仅添加数据),则会出现此错误。如果您尝试将Image对象设置为UI中已有的另一个Image,而不是将Source的{​​{1}}属性设置为当前Image的{​​{1}}属性你会得到这个错误。

在没有看到你的代码的情况下,我们将无法弄清楚你为什么会遇到这个错误......从你的堆栈跟踪中,我猜你在调用Image时会遇到这个错误,但是有除了在该对话框或视图中问题可能之外没有太多线索。

希望您现在能够更好地理解问题,可能能够自行解决问题。

答案 1 :(得分:0)

我有一个类似的错误,因为在我使用它之前,我有另一个(不同的)对象与WPF控件交互。我需要删除一些旧代码。我的执行信息类似...... The root Visual of a VisualTarget cannot have a parent。确保控件仅使用一次。在我的例子中,我将WPF控件放在Winforms ElementHost中,然后尝试在WPF主机中使用它。