这让我困扰了将近一年。我会更新答案并添加赏金。
我是自定义控件,具有依赖属性
public class Graph : Control
{
public List<Figure> Figures
{
get { return (List<Figure>)GetValue(FiguresProperty); }
set { SetValue(FiguresProperty, value); }
}
public static readonly DependencyProperty FiguresProperty =
DependencyProperty.Register("Figures", typeof(List<Figure>), typeof(Graph),
new PropertyMetadata((d, e) => ((Graph)d).InvalidateVisual()));
...
}
Figure
是所有数字的基类:
public abstract class Figure { ... }
public class LineFigure : Figure { ... }
public class XGridFigure : Figure { ... }
public class YGridFigure : Figure { ... }
...
现在看看下面的截图来看问题:有时候(在其他地方对xaml进行更改之后)设计师为此疯狂并停止渲染整个窗口,抛出异常,代码编译并运行时没有问题即可。我可以关闭这个xaml(设计师)并再次打开它以使问题消失。但它总是重新出现。
问题:我身边有什么问题吗?缺少属性?错误的用法?我该如何解决这个问题?
丑陋的情况。
我有2 UserControl
。在两个手工制作的控件Graph
中都使用了。 Graph
具有属性Figures
以指定List<Figure>
。有数十个数字以Figure
为基础。
在一个UserControl
中它可以正常工作,在其他抛出异常中
无法将指定的值分配给集合。预计会出现以下类型:&#34;图&#34;。
我没有看到可能导致问题的区别。
这是一个有问题的截图
这里有一个
尽管项目编译和运行存在错误,但如果我需要对有问题的UserControl
进行修改,那么它就不会显示任何内容(说&#34;标记无效&#34;)。图表几乎相同,所有8
错误仅显示一个UserControl
。
我该怎么办?如何解决此类错误?我({完全)排除了(完全)Graph
的任何问题,因为它运行没有一个问题并且它对另一个UserControl
没有问题。 Visual Studio设计师的问题?使用2013 Express for Windows Desktop。
答案 0 :(得分:2)
关闭项目,重新启动VS并重新打开它。它还列出错误吗?视觉工作室似乎经常报告“幻影错误”,但如果你关闭并重新启动等,它们通常会消失。
答案 1 :(得分:2)
如果自定义控件位于同一个解决方案或项目中,Visual Studio会构建它(当它认为有必要时),以便它可以使用设计器中的控件。
有时这个构建/缓存的版本与代码文件不同步,导致Xaml解析器/语法检查器混淆并显示那些波浪形的红线。
我已经成功关闭并重新打开所有使用该控件的设计人员,但这仍然非常烦人。根据我的经验,最可靠的解决方案是将控制转移到一个单独的解决方案和项目中,并设置一个适当的解决方案。参考dll。
答案 2 :(得分:2)
确实,视觉设计师无法识别Figure
的继承。一种解决方案是使用IList作为接口类型:
public IList Figures
{
get
{
return (IList)GetValue (FiguresProperty);
}
set
{
SetValue (FiguresProperty, value);
}
}
public static readonly DependencyProperty FiguresProperty =
DependencyProperty.Register ("Figures", typeof (IList), typeof (Graph), new PropertyMetadata (new List<object>()));
这可能看起来有点奇怪(因为你放弃了类型安全性)。但仔细看看WPF课程。他们都这样做(很可能有充分的理由)。或者WPF甚至会创建像PathFigureCollection
这样的集合类,它们同时实现IList
和IList<PathFigure>
。