1

我能够将设计时装饰器添加到 WPF 控件,但是如何控制那些内置在设计器中的控件?(换句话说,我希望当有人使用标准设计师的拇指/橡皮筋/装饰器/...拖动或调整控件大小时调用我的函数)

.

以下是有关我要完成的工作的详细信息

我正在编写一个类似 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 画布上的位置(即 X = Left ,而不是 X = Left - Width / 2 as ArrangeOverride规定)

看来我需要控制设计师。微软甚至提供了如何做到这一点的文档:演练:创建设计时装饰器。它似乎可以工作,但是我找不到一种方法来控制Visual Studio 中内置的装饰器如何工作(选择控件时出现在控件周围的那些大小拇指),只有如何添加新的。当然,我可以只添加一些并指示任何人不要碰标准的,但它看起来像一个丑陋的组合。

出于这个问题的目的,可以安全地假设我可以访问画布及其子画布的源代码(即可以覆盖方法),尽管首选只需要更改父画布的方法。

关于设计器可扩展性的官方文档让我有些困惑。我也没有运气在网上搜索此事。因此,任何有用的线索都将不胜感激——比如书籍、文章、示例、参考源链接等。

4

0 回答 0