我能够将设计时装饰器添加到WPF控件中,但是如何控制内置于设计器中的那些? (换句话说,当任何人使用标准设计师的拇指/橡皮筋/ adorners /...)拖动或调整控件的大小时,我希望调用我的函数。
以下是我要完成的内容的详细信息:
我正在编写一个类似WPF Canvas的控件,该控件具有自定义规则来放置和调整其大小。 (它也应该旋转,但这是另一个问题)
<my:MyCustomCanvas>
<my:SomeControl my:Name="child control #1" Canvas.Left="20" Canvas.Top="30"/>
<my:SomeOtherControl my:Name="child control #2" Canvas.Left="70" Canvas.Top="80"/>
</my:MyCustomCanvas>
实现此目的的一种方法是重写ArrangeOverride(),如下所示:
public class CustomCanvas : Canvas
{
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in InternalChildren)
{
double left = child.GetValue(Canvas.LeftProperty) - this.GetValue(ActualWidthProperty) / 2;
double top = child.GetValue(Canvas.TopProperty) - this.GetValue(ActualHeightProperty) / 2;
child.Arrange(new Rect(new Point(left, top), child.DesiredSize));
}
return arrangeSize;
}
}
它可以工作,但是如果您尝试在设计器中拖动或调整子控件的大小,它会跳到原来的WPF Canvas上的位置(即X = Left,而不是X = Left - Width / 2作为ArrangeOverride指示)
看起来我需要控制设计师。 Microsoft甚至提供了如何执行此操作的文档:Walkthrough: Creating a Design-time Adorner。它似乎工作,但我没有找到一种方法来控制内置到visual studio 中的装饰如何工作(选择控件周围出现的拇指大小),只是如何添加< em>新的。当然,我可以添加一些,并指示任何人不要接触标准的,但它看起来像一个丑陋的kludge。
出于这个问题的目的,可以安全地假设我可以访问canvas及其子代的源代码(即可以覆盖方法),尽管只需要改变父画布是首选。
Official documentation on designer extensibility对我来说有点混乱。我也没有在网上搜索此事。因此,任何有用的线索将非常受欢迎 - 如书籍,文章,示例,参考源链接等。