“类型为FixedToolBar的值无法添加到类型为'UIElementCollection'的集合或字典中”,但FixedToolBar是UIElement的子类。

9
我们有一个自定义控件叫做FixedToolBar,它在一个类库中定义,被第二个程序集引用,并通过XAML使用它。但是,VS2015显示错误:
“不能将类型为FixedToolBar的值添加到类型为'UIElementCollection'的集合或字典中”
以下是类本身:
public class FixedToolBar : Control // <-- Control is a subclass of UIElement
{
    // Bla bla
}

以下是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>

更奇怪的是只有在XAML编辑器打开时才显示错误,否则编译和运行都很好!你有什么想法吗?这真的很烦人,因为VS会在设计时报告所有这些错误。所有这些红色波浪线使得XAML几乎无法阅读!

2
给那位给这个帖子点了踩的人...能解释一下为什么吗? - Mark A. Donohoe
1
这里有同样的问题涉及到各种控件。目前问题有没有更新?似乎会导致我们客户端的 BAML 解析时的运行时问题。 - JanW
2
@MarqueIV 今天我遇到了这个问题。我所要做的就是卸载并重新加载我的项目。显然,当我在项目中添加外部引用时发生了这种情况。通过执行上述步骤,Visual Studio成功将新的.dll完全接受到我的项目中。干杯! - mmangual83
1个回答

0

据传说,这些幽灵错误波浪线经常出现在以下情况下:

  • 您的xaml位于A项目中。
  • A项目在其引用中包括B项目。
  • 您要添加到集合中的元素类型在B项目中定义。
  • 元素类型依赖于在C项目中找到的某些类型。
  • A项目没有明确将C项目包含在其引用中。(因为它不必这样做。)

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

但显然,xaml子系统有一个自己解析项目依赖关系的需求,而且它不够聪明,无法递归解析它们。

解决方案是使A项目明确引用C项目,尽管它不使用它。

此外,请注意在尝试这样做时,你可能会遇到进一步的复杂情况。例如,如果你编辑 A.csproj 并添加对项目 B 的 PackageReference,然后重新加载项目 A,则该引用可能不会出现在“引用”下方,这种情况下,幻影波浪线将无法消失。进行适当的全面清除重建往往可以解决该问题。

我得重新查看那个代码库,看看这是否解决了它。这真的很烦人。 - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接