我知道我应该发布一个带有代码示例的非常具体的问题,但我不知道从哪里开始:
在Visual Studio中运行我的应用程序时,无论是在调试模式下还是在发布模式下,都可以。但是当我创建 InstallShield 安装程序时,在其他计算机中,我收到异常:
System.Windows.Threading.Dispatcher WPF 指定元素已经是另一个元素的逻辑子元素。先断开连接
我已经在 StackOverflow 和其他网站上看到了大量关于这个问题的帖子,但没有参考,这只发生在已安装的软件包中。
我的问题是双重的(也很抱歉):
- 我怎么可能调试这样的问题?我的意思是,特别是如果可能的话(不是通用的运行时调试)
- 我可以捕获哪种类型的异常,从而提供有关错误的更多信息?我正在显示一个显示 ReflectionTypeLoadException 的消息框。我很想看看哪个元素是带有"双亲"或"双子"的元素。
更复杂的是,该应用程序在我用于开发的计算机上运行良好,但在其他计算机(例如,我父亲和姐姐的计算机)中,它因此例外而崩溃。
任何线索都将受到赞赏和适当的投票。谢谢
-----------------------------------编辑-------------------------------------
我设法将这个麻烦的孩子逼到ListView的ItemTemplate中名为"textAvisosSeccion"的文本块中:
<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="{Binding Value.Avisos}"。ListView 绑定到使用 MEF 导入的Lazy<T>
集合,其中 T 具有"Avisos"属性。另一个TexkBlock绑定到Lazy<T>
的元数据,这很好。
除了我绑定到 Lazy 值的原因(它实例化对象,失去懒惰者的优势)之外,为什么我会因此得到"指定元素已经是另一个元素的逻辑子元素"异常?!?!?
"Avisos"属性只是ViewModel中的一个整数(它不是从UIElement继承的)。
编辑#2:
像这样的异常和其他(样式问题,MEF组合问题等)没有在VS2012中抛出,因为它安装了.NET Framework 4.5。即使所有项目都针对框架4.0。
如果您正在为4.0开发,请购买一台带有Vista的旧机器,请确保您已安装4.0并使用VS2010;这是确保的唯一方法。
这不是问题的真正答案,而是我找到的问题解决方案:在客户端计算机中安装 .NET Framework 4.5,应用程序就像一个魅力一样运行。
删除麻烦的 TextBlock 后,应用程序打开了,但在很多地方抛出了相同的异常,但没有明显的原因:一些 ViewModels 和 View 工作正常,而另一些则不然。当然,它们都是以相同的方式构建的,所以没有解释。
我发现这个SO问题指的是这个问题,但没有好的答案:
WPF 4.5 父子行为是否发生了变化:我们现在可以毫无例外地将子项添加到另一个父级?
对于这个人来说,它创造了一个问题而不是解决它。但是出现了一个可怕的问题:我们如何知道在下一个框架版本中是否一切都会相同?也许这是 4.0 中的一个错误,在 4.5 中修复了,他们不想谈论它。
另一个主要问题是异常没有提供关于哪些元素有问题的真实信息,因此调试几乎毫无用处。我在某个论坛上发现,这作为改进建议发布到Microsoft,他们一再拒绝。
希望这对某人有所帮助,我也希望有人告诉我如何更深入地挖掘执行以了解哪个元素是抱怨的。
在这里也复制编辑#2:
像这样的异常和其他(样式问题,MEF组合问题等)没有在VS2012中抛出,因为它安装了.NET Framework 4.5。即使所有项目都针对框架4.0。
如果您正在为4.0开发,请购买一台带有Vista的旧机器,请确保您已安装4.0并使用VS2010;这是确保的唯一方法。