如何制作支持设计时拖放的自定义 WPF ContentControl?

3
我想创建一个自定义的WPF控件,其中只有一个“子”控件。虽然通过子类化ContentControl或UserControl可以实现,但是存在一个缺点:这些控件在设计模式下不起作用。
所谓的“不起作用”是指以下情况:假设我有一个Canvas,其中包含我的自定义控件。我想在我的控件中放置一个Button。我从工具箱中拖动它,它似乎出现在我的控件内部。但是,XAML视图显示新的按钮实际上属于Canvas,而不是我的控件。
我可以通过手动编辑XAML将其放置在我的控件内部,但我希望设计器也能正常工作。
有趣的是,当我子类化Canvas、Grid或Panel时,设计器按预期工作。然而,这些控件有许多子元素,这不是我需要的。
如何制作一个在设计器中正常工作的单个子控件?

1
这是一个不错的链接,看起来你需要一组具有设计时功能的类。http://www.codeproject.com/KB/WPF/XPlorerBar2.aspx - user572559
抱歉,伙计,我不是故意投反对票的,我该怎么撤销它? - user572559
@Dmitry,我没有在你提供的链接中找到答案,但它对我需要做的其他WPF工作仍然非常有帮助,谢谢。 - Nevermind
@Dmitry:我进行了一次“编辑”,请看看你现在能否撤销你的反对票。 - BoltClock
3个回答

3
如何从Border进行继承?这样你就可以避免与设计师可扩展性的麻烦。

1

我在编写内容控件时遇到了同样的问题,并在StackOverflow thread上找到了一个简单的解决方案。

只需实现HitTestCore方法:

protected override System.Windows.Media.HitTestResult HitTestCore(System.Windows.Media.PointHitTestParameters hitTestParameters)
{
    return new PointHitTestResult(this, hitTestParameters.HitPoint);
}

1

我也有一个类似的问题在这里

但是经过深入挖掘,看起来真正的答案是“否”,没有任何官方方法支持将控件直接拖到自定义内容控件中的设计时拖放,即使像Stephan's的答案建议实现'HitTestCore',也不能在ContentControl的设计时启用拖放。

为此,您应考虑从Grid或Panel(以允许多个子控件)或Border(以允许单个子控件)继承。


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