"类型为FixedToolBar的值不能添加到'UIElementCollection'类型的集合或字典中",但FixedToolBar是UIElement的子类

Mar*_*eIV 6 wpf xaml controls uielement visual-studio-2015

我们在类库中定义了一个名为FixedToolBar的自定义控件,该库由第二个程序集引用,该程序集通过XAML使用它.但是,VS2015显示错误:

类型为FixedToolBar的值无法添加到"UIElementCollection"类型的集合或字典中

这是班级本身

public class FixedToolBar : Control // <-- Control is a subclass of UIElement
{
    // Bla bla
}
Run Code Online (Sandbox Code Playgroud)

......这是XAML片段......

<DockPanel>

    <c:FixedToolBar x:Name="MainToolBar" DockPanel.Dock="Top">
        <Button Header="Test 1" />
        <Button Header="Test 2" />
    </c:FixedToolBar>

    <ListBox x:Name="MainListBox" />

</DockPanel>
Run Code Online (Sandbox Code Playgroud)

更奇怪的是它只显示XAML编辑器打开时的错误,但否则编译并运行就好了!

有什么想法吗?让VS在设计时报告所有这些错误真的很烦人.所有那些红色波浪形使得XAML da @ n几乎不可读!

Mik*_*kis 0

据传,这些幻影错误曲线经常出现在以下情况下:

  • 您的 xaml 位于项目 A 中。
  • 项目 A 在其参考文献中包含项目 B。
  • 您要添加到集合中的元素的类型在项目 B 中定义。
  • 元素的类型取决于项目 C 中找到的某种类型。
  • 项目 A 未在其引用中明确包含项目 C。(因为它不必这样做。)

就构建系统而言,这根本不是问题,因为项目A的依赖是递归计算的,所以它们包括依赖的依赖,所以项目C当然也会包括在内。

但显然 xaml 子系统出于某种难以理解的原因需要自行解决项目依赖关系,并且它不够聪明,无法递归地解决它们。

解决方案是让项目 A 显式引用项目 C,尽管事实上它并不使用它。

另请注意,在尝试这样做时,您可能会遇到进一步的复杂情况,例如,如果您编辑 A.csproj 以将 PackageReference 添加到项目 B,然后重新加载项目 A,则该引用可能不会出现在“引用”下,在这种情况下,幻影曲线不会消失。适当的完全干净的重建往往可以解决这个问题。