我用来为TabControl的TabItems设置样式的资源字典XAML在此处here给出。(只需创建一个简单的TabControl并将给定的ResourceDictionary应用于测试即可。)
具体而言,由于以下行导致了错误(通过试错测试发现的,因为Visual Studio实际上没有在设计时报告它)。
<TranslateTransform X="{Binding ActualWidth, ElementName=leftSideBorderPath}"/>
在跟踪(输出窗口)中给出的完整错误如下:
System.Windows.Data Error: 2 : 无法找到目标元素的主控 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=ActualWidth; DataItem=null; target element is 'TranslateTransform' (HashCode=35345840); target property is 'X' (type 'Double')
该错误在加载时发生,重复出现5次,然后(请注意,示例中有3个选项卡)。每当调整窗口大小时,例如填充输出窗口时,它也会一致且重复地出现。也许每次 TabItem 布局更新时都会发生?
再次说明,尽管没有报告,但错误非常可能是因为我绑定到 任何 元素,而不是特定的 leftSideBorderPath 或 ActualWidth 属性。例如,将此行更改为以下内容即可修复问题。
<TranslateTransform X="25"/>
不幸的是,硬编码值并不是一个真正的选项。
这个问题对我来说似乎非常奇怪,因为绑定似乎给出了正确的结果。(在运行时检查TranslateTransform的X值清楚地显示了正确的绑定值,并且查看ClipGeometry时也完全符合预期。)无论是Visual Studio还是WPF似乎都没有给我更多关于错误原因的信息(将PresentationTraceSources.TraceLevel设置为High也没有帮助),然而尽管报告了错误,事情仍然在工作,这让我倾向于认为这是一些边缘案例的WPF bug。
顺便说一句,Visual Studio WPF设计师和XAML编辑器在以下行中给我带来了问题:
<PathGeometry Figures="{Binding Source={StaticResource TabSideFillFigures}}"/>
尽管在运行时,WPF可以将图形绑定到TabSideFillFigures字符串,并通过绑定强制使用TypeConverter,但XAML编辑器和WPF设计器会发出警告。控件模板的所有XAML代码都被下划线标记,并且在错误列表中出现以下错误:
错误9:'{DependencyProperty.UnsetValue}'不是Setter上'System.Windows.Controls.Control.Template'属性的有效值。C:\Users\Alex\Documents\Visual Studio 2010\Projects\Ircsil\devel\Ircsil\MainWindow.xaml 1 1 Ircsil
错误10:对象引用未设置为对象实例。C:\Users\Alex\Documents\Visual Studio 2010\Projects\Ircsil\devel\Ircsil\Skins\Default\MainSkin.xaml 58 17 Ircsil
再次重申,一切在运行时都能正常工作,这使得这个问题特别奇怪...
请问有人能够解决这些问题吗?尤其是第一个问题(似乎是潜在的WPF错误)和后一个问题(似乎是Visual Studio错误)。非常感谢任何反馈或建议!
编辑:
我已将完整解决方案(一个相当小的项目)上传到我的服务器上,作为ZIP文件。您应该能够立即看到错误,并准备进行测试。