wpf 剪裁装饰层

dfuffjeb  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个PanZoomImage类定义如下:

<Border Grid.Row="0" Name="border" ClipToBounds="True">
    <Canvas Name="canvas">
        <Image Name="image" RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None" 
           Source="{Binding Path=Source}"
           MouseLeftButtonDown="image_MouseLeftButtonDown"
           MouseLeftButtonUp="image_MouseLeftButtonUp"
           MouseMove="image_MouseMove"
           MouseWheel="image_MouseWheel"
           Loaded="image_Loaded">
        </Image>
    </Canvas>
</Border>

有时候我想在图像上显示Adorners,这样我就有了一个属性,为图像提供了AdornerLayer

public AdornerLayer Adorners
{
    get
    {
        return AdornerLayer.GetAdornerLayer(image);
    }
}

我使用这个属性为图像添加不同的装饰器。问题是,当我平移或缩放图像时,aodrner不会被裁剪,而是显示在持有PanZoomImage的控件之外,如下所示:

我尝试了几种解决方案:
我尝试为边框、画布和图像设置ClipToBounds=True
我试着为AdornerLayer和每个Adorner单独设置ClipToBounds=True
我尝试在Adorner的OnRender中设置剪辑几何体。
我还注意到Adorner有一个IsClipEnabled属性,但当我尝试将其设置为true时,我一直得到一个NullReferenceException(即使Adorner绝对不是null)。
谢谢!

rbpvctlc

rbpvctlc1#

IsClipEnabled属性起作用。如果装饰的控件没有父控件,则引发NullPointerException。在设置IsClipEnabled之前,您必须将控件放置到某个容器中。

unhi4e5o

unhi4e5o2#

对我来说,秘密来源是:
1.在装饰器上设置IsClipEnabled=true
1.在装饰元素上设置ClipToBounds=true

相关问题