首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MeasureOverride和ArrangeOverride不被调用

MeasureOverride和ArrangeOverride不被调用
EN

Stack Overflow用户
提问于 2012-01-03 14:25:37
回答 1查看 2.3K关注 0票数 0

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

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

代码语言:javascript
复制
protected override void OnRender(DrawingContext drawingContext)
{
    drawingContext.DrawEllipse(
        new SolidColorBrush(Colors.CornflowerBlue), 
        null, 
        new Point(1292, 100),
        100, 100);   
} 

使用ZoomControl xaml:

代码语言:javascript
复制
<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>

应用装饰:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
    <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>

描述是这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-03 15:29:02

好的,我查看了您的示例应用程序,并检查了它与窥探。因此,该转换似乎也被应用于您的装饰器,但视觉并没有得到正确的更新。平移实际上是有效的,它只是你的装饰品没有被正确的失效。一个快速的想法是为缩放、转换x、转换y和设置属性标志"AffectsRender“提供装饰器依赖属性,并将它们从缩放控件绑定到画布上。现在,每当缩放控件修改这些属性之一时,装饰器属性就会通过绑定更新,并通过"AffectsRender“标志直接失效。

第一个答案,但无效

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8713726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档