拦截设计时拖动和调整自定义WPF画布子控件的大小

时间:2015-06-27 07:11:05

标签: wpf canvas design-time adorner arrangeoverride

我能够将设计时装饰器添加到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对我来说有点混乱。我也没有在网上搜索此事。因此,任何有用的线索将非常受欢迎 - 如书籍,文章,示例,参考源链接等。

0 个答案:

没有答案