0

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

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

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 中?

示例应用程序在这里

解决方案:

我不得不将我的画布放入 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>

说明在这里

4

1 回答 1

1

好的,我查看了您的示例应用程序并使用 snoop 进行了检查。因此,似乎转换也以某种方式应用于您的装饰器,但视觉效果未正确更新。平移实际上有效,只是您的装饰器没有正确失效。一个快速的想法是为您的装饰器依赖属性提供缩放、平移 x、平移 y,并设置属性标志“AffectsRender”并将它们从缩放控件绑定到您的画布。现在,每次您的缩放控件修改这些属性之一时,装饰器属性都会通过绑定更新,并通过“AffectsRender”标志直接失效。

[第一个答案,但无效]

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

于 2012-01-03T15:29:02.243 回答