我正在使用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。
答案 0 :(得分:1)
好的,我查看了您的示例应用并使用snoop进行了检查。因此,似乎转换以某种方式应用于您的装饰者,但视觉效果未正确更新。实际上,平移工作只是因为你的装饰者没有被正确地无效。 一个快速的想法是给你的adorner依赖属性进行缩放,翻译x,翻译y,并设置属性标志“AffectsRender”并将它们从缩放控件绑定到画布。现在,每当缩放控件修改其中一个属性时,装饰属性都会通过绑定进行更新,并通过“AffectsRender”标志直接无效。
[第一个答案,但无效]
您是否将变焦控制的变换应用于您的装饰师?因为装饰器没有放在控件上,实际上它是在下一个AdornerDecorator中注册的,从提供的控件开始向上找到。我的猜测是找到的唯一装饰器(或层)是窗口上的默认装饰器。将控件的转换应用到您的装饰器,它应该工作。或者你可以在你的Zoomcontrol中放置一个AdornerDecorator,但说实话,我不确定这是否具有预期的效果。