不调用MeasureOverride和ArrangeOverride

时间:2012-01-03 14:25:38

标签: c# wpf adorner measureoverride arrangeoverride

我正在使用WPFExtensions的ZoomControl。源代码为here

我在OnRender方法中添加了adorner:

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

使用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);
}

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

当我缩放时 - 一切都还可以。 Adorner会根据图像控件的变化更改其位置。

问题出在我的代码或ZoomControl中?

示例应用为here

SOLUTION:

我必须将画布放入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>

说明是here

1 个答案:

答案 0 :(得分:1)

好的,我查看了您的示例应用并使用snoop进行了检查。因此,似乎转换以某种方式应用于您的装饰者,但视觉效果未正确更新。实际上,平移工作只是因为你的装饰者没有被正确地无效。 一个快速的想法是给你的adorner依赖属性进行缩放,翻译x,翻译y,并设置属性标志“AffectsRender”并将它们从缩放控件绑定到画布。现在,每当缩放控件修改其中一个属性时,装饰属性都会通过绑定进行更新,并通过“AffectsRender”标志直接无效。

[第一个答案,但无效]

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