与ToolTip相关的难以捉摸的WPF异常

时间:2015-02-18 18:00:25

标签: wpf vb.net xaml

我已经部署了我的(相当复杂和相当大的)WPF应用程序的版本,并且一些用户(并非所有用户)遇到以下异常。

FEHLER: Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch.
   bei System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)
   bei MS.Internal.FrameworkObject.ChangeLogicalParent(DependencyObject newParent)
   bei System.Windows.FrameworkElement.AddLogicalChild(Object child)
   bei System.Windows.Controls.ContentControl.OnContentChanged(Object oldContent, Object newContent)
   bei System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   bei System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   bei System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   bei System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   bei System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
   bei System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal)
   bei System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   bei System.Windows.Data.BindingOperations.SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)
   bei System.Windows.Controls.PopupControlService.RaiseToolTipOpeningEvent()
   bei System.Windows.Controls.PopupControlService.OnRaiseToolTipOpeningEvent(Object sender, EventArgs e)
   bei System.Windows.Threading.DispatcherTimer.FireTick(Object unused)
   bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)

异常消息的英文版本是:

Specified element is already the logical child of another element. Disconnect it first.

我的主要问题是, a)我无法在我的开发机器上重现这一点。 这并不意味着它不会在相同的情况下发生,而是用户都独立地说,异常发生在软件的特定时间点,动作或状态。

b)上述调用中没有一个实际上是指我自己的代码。 所以我猜它一定是XAML中的某个地方

我完全迷失了,并希望能够在一个粗略的方向上寻找一些指针。

编辑:我现在能够重现并隔离问题

Demo Application

演示应用程序再现了当复杂的工具提示(除了字符串对象之外的任何东西)放置在元素(按钮)上时将发生的异常,而元素又被放置在弹出窗口上。

<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    <ToggleButton x:Name="_PopUpToggle" Content="Open Popup"/>
    <Popup 
        IsOpen="{Binding ElementName=_PopUpToggle,Path=IsChecked}" 
        Placement="Bottom"
        >
        <Grid Background="Wheat">
            <StackPanel 
                HorizontalAlignment="Center" 
                VerticalAlignment="Center">
                <Button 
                    Content="StackPanelToolTip"
                    Click="Button_Click">
                    <Button.ToolTip>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Not "/>
                            <TextBlock Text="Plain"/>
                        </StackPanel>
                    </Button.ToolTip>
                </Button>
            </StackPanel>
        </Grid>
    </Popup>
</Grid>

要重现启动应用程序,请打开弹出窗口,将鼠标悬停在第一个按钮上,等待ToolTip出现并单击。重复。这会产生以下Exception以及相应的TraceStack:

Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch.
   bei System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)
   bei System.Windows.FrameworkElement.AddLogicalChild(Object child)
   bei System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   bei System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   bei System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   bei System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   bei System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
   bei System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal)
   bei System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   bei System.Windows.Data.BindingOperations.SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)
   bei System.Windows.Controls.PopupControlService.RaiseToolTipOpeningEvent()
   bei System.Windows.Threading.DispatcherTimer.FireTick(Object unused)
   bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

异常消息的英文版本是:

Specified element is already the logical child of another element. Disconnect it first.

将ToolTip绑定到普通的String对象(尝试第二个Button)确实可以正常工作。这是我目前的解决方法。

1 个答案:

答案 0 :(得分:0)

Mathew指出,在<ToolTip></ToolTip>中附上ToolTip-Property的复杂内容可以解决问题。