【问题标题】:Opacity Masks in WPF - Excluding ShapesWPF 中的不透明蒙版 - 不包括形状
【发布时间】:2014-01-24 04:09:36
【问题描述】:

我目前正在创建一个 PDF 查看器,如果用户将光标移到当前幻灯片(在外部文件中定义)的多个感兴趣区域之一上,幻灯片的其余部分将变暗,突出显示该区域。

目前,这些感兴趣的区域是路径形状,使用Geometry.Parse() 方法使用外部文件中提供的信息创建并存储在List<List<Path>> 中。

此着色的当前 XAML 如下:

    <Image Name="SlideImage" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Image.OpacityMask>
            <DrawingBrush Opacity="0.4">
                <DrawingBrush.Drawing>
                    <GeometryDrawing x:Name="ShadeGeometry">
                        <GeometryDrawing.Brush>
                            <RadialGradientBrush>
                                <RadialGradientBrush.GradientStops>
                                    <GradientStop Offset="0" Color="Transparent"/>
                                    <GradientStop Offset="1" Color="Black"/>
                                </RadialGradientBrush.GradientStops>
                            </RadialGradientBrush>
                        </GeometryDrawing.Brush>
                        <GeometryDrawing.Pen>
                            <Pen Thickness="0.1" Brush="Black"/>
                        </GeometryDrawing.Pen>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Image.OpacityMask>
 <Image>

绘图的几何形状通过以下方法改变:

public void ShadeCommand(ref GeometryDrawing ShadeGeometry, int page, int shape)
{
    if (page < commands.Count && shape < commands[page].Count)
    {
        ShadeGeometry.Geometry = Geometry.Parse(
            "M 0,0 " + "H " + resolution.X + " V " + resolution.Y +
            " H 0 V 0 L " + commands[page][shape].Substring(2) + " Z");
    }
    else
    {
        ShadeGeometry.Geometry = null;  //Geometry.Empty
    }
}

这会绘制一个围绕图像区域的形状,然后是给定的形状,然后返回起点。

这种方法的问题在于它会创建看起来非常奇怪的形状,并且不透明蒙版的渐变似乎会使一个区域变白而不是使其余区域变暗。

我不太担心从黑暗逐渐转变为形状,只要我能找到一种解决方案,使形状周围的区域变暗但仍然显示下面的幻灯片,我会很高兴地离开。提前致谢。

【问题讨论】:

    标签: wpf pathgeometry opacitymask


    【解决方案1】:

    用一个半透明的黑色路径元素覆盖图像可能更容易,该路径元素使用一个CombinedGeometry,由一个足够大的RectangleGeometry 和一个排除的PathGeometry 组成。

    像这样:

    <Grid>
        <Image Source="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg" Stretch="None"/>
        <Path Fill="Black" Opacity="0.5"> 
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Exclude">
                    <CombinedGeometry.Geometry1>
                        <RectangleGeometry Rect="0,0,10000,10000"/>
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <PathGeometry Figures="M 280,375 l100,-50 100,50 -100,50z"/>
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
    </Grid>
    

    您现在可以通过编程方式调整 CombinedGeometry.Geometry2 中的 PathGeometry(或者 StreamGeometry)。

    【讨论】:

    • 完全符合我的需要。 “内部形状”看起来仍然一团糟,但我确信这是一个我可以解决的单独问题。非常感谢!
    • @DanMcElroy 不客气。也许您不应该使用 Geometry.Parse() 来创建内部几何体,而应使用 PathGeometry 或 StreamGeometry API。如果内部形状只是一个矩形,那么 RectangleGeometry 会更容易创建。
    猜你喜欢
    • 2011-12-17
    • 2018-11-26
    • 2016-12-05
    • 1970-01-01
    • 2011-06-02
    • 2022-11-15
    • 2010-11-21
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多