不调用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>
好的,我查看了您的示例应用程序并使用snoop检查了它。因此,似乎转换以某种方式应用到您的装饰器,但视觉没有正确更新。事实上,淘金是有效的,只是你的装饰器没有被适当地无效化。一个快速的想法是给你的装饰依赖属性缩放,翻译x,翻译y,并设置属性标志"AffectsRender",并将它们从缩放控件绑定到画布。现在,每次你的缩放控件修改这些属性之一,装饰器属性通过绑定更新,并直接通过"AffectsRender"标志失效。
[第一个答案,但无效]
您是否将缩放控件的变换应用于您的装饰器?因为装饰器没有放置在控件上,实际上它是在下一个AdornerDecorator中注册的,从所提供的控件开始向上找到。我猜唯一找到的装饰器(或层)是窗口上的默认装饰器。应用控件的变换到你的装饰器,它应该工作。或者你可以在你的缩放控件中放置一个AdornerDecorator,但说实话,我不确定这是否有想要的效果