不调用MeasureOverride和ArrangeOverride

本文关键字:ArrangeOverride MeasureOverride 调用 | 更新日期: 2023-09-27 18:19:15

我正在使用WPFExtensions中的ZoomControl。源代码在这里。

我用OnRender方法添加了装饰器:

protected override void OnRender(DrawingContext drawingContext)
{
    drawingContext.DrawEllipse(
        new SolidColorBrush(Colors.CornflowerBlue), 
        null, 
        new Point(1292, 100),
        100, 100);   
} 

using ZoomControl xaml:

<Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue">
        <Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
            <Image HorizontalAlignment="Center"
                   Name="image1" Stretch="Fill"  
                   VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg" 
                   Margin="0,0,0,0" Canvas.Left="1"
                   Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
                  <Image.LayoutTransform>
                      <RotateTransform Angle="{Binding Path=SModel.Angle}" />
                  </Image.LayoutTransform>
            </Image>
        </Canvas>
</Controls:ZoomControl>
应用装饰器:

public Window1()
{
    InitializeComponent();
    image1.Loaded += loaded;
}
private void loaded(object sender, RoutedEventArgs e)
{
    var adorner = new SplitAdorner(image1);
    AdornerLayer.GetAdornerLayer(image1).Add(adorner);
}

当我拖动图像控件时,我的装饰器不移动。

我已经试过重写ArrangeOverride和MeasureOverride:

protected override Size MeasureOverride(Size constraint)
{
    Debug.WriteLine("measureoverride");
    InvalidateVisual();
    return base.MeasureOverride(constraint);
}
protected override Size ArrangeOverride(Size finalSize)
{
    Debug.WriteLine("arrangeoverride");
    InvalidateVisual();
    return base.ArrangeOverride(finalSize);
}

但没有效果。输出窗口中没有任何内容,并且装饰器没有移动。

当我缩放时-一切都很好。装饰器会根据图像控件的变化而改变其位置。

问题是在我的代码或在缩放控制?

示例应用程序在这里

解决方案:

我必须把画布放到AdornerDecorator:

    <Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue">
        <AdornerDecorator>
            <Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
                <Image HorizontalAlignment="Center"
                   Name="image1" Stretch="Fill"  
                   VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg" 
                   Margin="0,0,0,0" Canvas.Left="1"
                   Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
                    <Image.LayoutTransform>
                        <RotateTransform Angle="{Binding Path=SModel.Angle}" />
                    </Image.LayoutTransform>
                </Image>
            </Canvas>
        </AdornerDecorator>
    </Controls:ZoomControl>

不调用MeasureOverride和ArrangeOverride

好的,我查看了您的示例应用程序并使用snoop检查了它。因此,似乎转换以某种方式应用到您的装饰器,但视觉没有正确更新。事实上,淘金是有效的,只是你的装饰器没有被适当地无效化。一个快速的想法是给你的装饰依赖属性缩放,翻译x,翻译y,并设置属性标志"AffectsRender",并将它们从缩放控件绑定到画布。现在,每次你的缩放控件修改这些属性之一,装饰器属性通过绑定更新,并直接通过"AffectsRender"标志失效。

[第一个答案,但无效]

您是否将缩放控件的变换应用于您的装饰器?因为装饰器没有放置在控件上,实际上它是在下一个AdornerDecorator中注册的,从所提供的控件开始向上找到。我猜唯一找到的装饰器(或层)是窗口上的默认装饰器。应用控件的变换到你的装饰器,它应该工作。或者你可以在你的缩放控件中放置一个AdornerDecorator,但说实话,我不确定这是否有想要的效果