【问题标题】:WPF InkCanvas draw even on space beyond bounds of Clip. Override Hit TestWPF InkCanvas 甚至在超出剪辑范围的空间上绘制。覆盖命中测试
【发布时间】:2018-08-06 14:36:01
【问题描述】:

我正在使用 InkCanvas.Clip 属性将我的 InkCanvas 剪辑成我需要的形状(为此我使用 PathGeometry)。我只能在这个区域开始绘图,但我希望能够在它之外开始绘图。当然,超出该区域的描边部分将不会显示。 我怎样才能做到这一点?我考虑过覆盖 InkCanvas 的 HitTestCore,也许默认情况下,HitTest 在我允许的绘图区域之外失败

【问题讨论】:

  • 在哪里显示被剪裁的 InkCanvas 之外的笔触?
  • @Iron 无处可去。现在,如果您开始在内部绘制并向外绘制,笔画会被注册,但它们不会显示在外部(如果您移除剪辑,您将能够在外部看到它们)。我希望能够开始在外面画画,然后进来。笔画应仅在内部显示
  • 由于InkCanvas 被剪裁,它无法接收触发绘图的MouseDown 事件。所以,你不能开始在外面画画,然后进来。
  • @Iron 我认为 Hit Test 可能在外面是负面的,我可以覆盖它。有可能吗?
  • 是的,HitTest 在外面无效。不幸的是,你不能覆盖它,因为剪裁的UIElement 将被 WPF 穿透。

标签: wpf drawing hittest inkcanvas


【解决方案1】:

也许OpacityMask可以实现你想要的:

  1. 要在外面剪裁的描边
  2. 开始在外面画画,然后进来。

<Grid Background="LightSalmon">
    <InkCanvas Background="LightBlue">
        <InkCanvas.OpacityMask>
            <DrawingBrush>
                <DrawingBrush.Drawing>
                    <GeometryDrawing>
                        <GeometryDrawing.Brush>
                            <SolidColorBrush Color="Black"/>
                        </GeometryDrawing.Brush>
                        <GeometryDrawing.Geometry>
                            <PathGeometry>
                                <PathGeometry.Figures>
                                    <PathFigure StartPoint="0,0">
                                        <PathFigure.Segments>
                                            <PolyLineSegment Points="100,0 100,100 0,100 0,0"/>
                                            <PolyLineSegment Points="100,0 100,100 0,100 0,0"/>
                                            <PolyLineSegment Points="30,30 70,30 70,70 30,70 30,30"/>
                                        </PathFigure.Segments>
                                    </PathFigure>
                                </PathGeometry.Figures>
                            </PathGeometry>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </InkCanvas.OpacityMask>
    </InkCanvas>
</Grid>

附加:

为了避免@SaintMSent 提到的转移,我们应该启用 InkCanvas 的 AdornerDecorator 的 ClipToBounds 属性:

<InkCanvas x:Name="MyInkCanvas" Background="LightBlue" Loaded="MyInkCanvas_OnLoaded">
    ......
</InkCanvas>

代码隐藏:

private void MyInkCanvas_OnLoaded(object sender, RoutedEventArgs e)
{
    var adornerDecorator = VisualTreeHelper.GetChild(MyInkCanvas, 0) as AdornerDecorator;
    if (adornerDecorator != null)
    {
        adornerDecorator.ClipToBounds = true;
    }
}

【讨论】:

  • 谢谢,我明天试试
  • 我试过了。似乎工作正常,但有一个问题。当我越过窗户的边界时,会发生一些奇怪的事情。我刚刚将您的代码粘贴到新的 WPF 项目中。如何修复? youtu.be/DCD9wr3s19g
  • 启用 InkCanvas 的 AdornerDecoratorClipToBounds 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2023-04-07
  • 2012-03-12
  • 2021-09-17
  • 2017-03-14
相关资源
最近更新 更多