首页 文章

如何在发行版中调试“指定元素已经是另一个元素的逻辑子元素”

提问于
浏览
2

我知道我应该用代码示例发布一个非常具体的问题,但我不知道从哪里开始:

在Visual Studio中运行我的应用程序时,无论是在调试模式还是在发布模式下都可以 . 但是当我创建InstallShield安装程序时,在其他计算机中我得到一个异常:

System.Windows.Threading.Dispatcher WPF指定的元素已经是另一个元素的逻辑子元素 . 首先断开它

我在StackOverflow和其他网站上看到过很多关于这个问题的帖子,但是只有在已安装的软件包中才会出现这种情况 .

我的问题是双重的(对不起):

  • 我怎么可能调试这样的问题?我的意思是,特别是如果可能的话(不是通用运行时调试)

  • 我可以捕到哪种异常,可以提供有关错误的更多信息?我'm displaying a MessageBox that shows a ReflectionTypeLoadException. I'我喜欢看哪个元素是"double parent"或"double child" .

为了使事情进一步复杂化,应用程序在我用于开发的计算机中运行良好,但在其他计算机中崩溃(例如,我父亲和姐姐的计算机) .

任何线索都将受到赞赏并得到应有的好评 . 谢谢

                                  • -编辑 - - - - - - - -----------------------

我设法将麻烦的孩子转移到ListView的ItemTemplate中名为“textAvisosSeccion”的TextBlock:

<ListView ItemsSource="{Binding Secciones}" Background="{Binding MiColor}"
          Style="{StaticResource NavigationMenuStyle}"
          IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SeccionActiva}"
          Margin="0" MinWidth="{Binding RelativeSource={RelativeSource
          AncestorType=ListBoxItem}, Path=ActualWidth}" HorizontalContentAlignment="Stretch">
             <ListView.ItemTemplate>
                <DataTemplate>
                     <DockPanel LastChildFill="True" HorizontalAlignment="Stretch">
                           <Grid DockPanel.Dock="Right" Margin="2,2,8,2"
                            Visibility="{Binding ElementName=textAvisosSeccion, Path=Visibility, FallbackValue=Collapsed}">
                                 <Ellipse Height="25" Width="25" VerticalAlignment="Center"
                                 Stroke="WhiteSmoke" StrokeThickness="1" Fill="OrangeRed"/>
                                 <TextBlock x:Name="textAvisosSeccion" FontSize="12"
                                  FontWeight="Medium" Foreground="WhiteSmoke"
                                  VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Style="{StaticResource TextBlockNullZeroCollapsedStyle}"
                                  Text="{Binding Value.Avisos}"/>
                             </Grid>

                          <TextBlock DockPanel.Dock="Left" Text="{Binding Metadata.NombreTraducido}" Margin="8,2" VerticalAlignment="Center" HorizontalAlignment="Stretch" TextAlignment="Center"/>

                     </DockPanel>
                  </DataTemplate>
               </ListView.ItemTemplate>
           </ListView>

<Style x:Key="TextBlockNullZeroCollapsedStyle" TargetType="TextBlock">
    <Style.Triggers>
        <Trigger Property="Text" Value="">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Trigger>
        <Trigger Property="Text" Value="0">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Trigger>
    </Style.Triggers>
</Style>

检查绑定Text = "" . ListView绑定到使用MEF导入的 Lazy<T> 的集合,其中T具有"Avisos"属性 . 另一个TexkBlock绑定到 Lazy<T> 's Metadata and it'罚款 .

除了我绑定到Lazy的值(实例化对象,失去懒惰的优势)的原因,为什么我得到一个“指定的元素已经是另一个元素的逻辑子”异常因为这个?!?!?

“Avisos”属性只是ViewModel中的一个整数(不是从UIElement继承) .

编辑#2:

VS2012中没有抛出像这样的例子和其他例子(样式中的问题,MEF组成问题等),因为它安装了.NET Framework 4.5的计算机 . 即使所有项目都针对Framework 4.0 .

如果您正在使用Vista开发旧版机器,请确保已安装4.0并使用VS2010;这是确保的唯一方法 .

1 回答

  • 3

    这不是问题的真正答案,而是我发现问题的解决方案:在客户端计算机中安装.NET Framework 4.5,应用程序就像魅力一样运行 .

    删除麻烦的TextBlock后,应用程序打开但在很多地方抛出相同的异常,但没有明显的原因:一些ViewModels和Views工作正常,其他人没有 . 当然,它们都以相同的方式构建,所以没有解释 .

    我发现这个SO问题引用了这个问题,但没有好的答案:

    Did WPF 4.5 parent-child behavior change: we can now add a child to another parent without exception?

    对于这个人来说,它创造了一个问题,而不是解决它 . 然而,出现了一个可怕的问题:我们怎么知道在下一个框架版本中,一切都会起作用?也许这是4.0中的一个错误,在4.5中修复了,他们不想谈论它 .

    另一个主要问题是该异常没有提供有关哪些元素存在问题的真实信息,因此调试几乎没用 . 我在一些论坛中发现,这是作为改进建议发布给微软的,他们一再拒绝它 .

    希望这对某人有所帮助,我也希望有人告诉我如何更深入地了解这一点,以了解哪个元素是抱怨的 .

    在这里复制编辑#2:

    VS2012中没有抛出像这样的例子和其他例子(样式中的问题,MEF组成问题等),因为它安装了.NET Framework 4.5的计算机 . 即使所有项目都针对Framework 4.0 .

    如果您正在使用Vista开发旧版机器,请确保已安装4.0并使用VS2010;这是确保的唯一方法 .

相关问题