2014-01-23 64 views
0

我目前正在創建一個PDF瀏覽器,如果用戶將光標移動到當前幻燈片(在外部文件中定義的)的感興趣區域中的一個區域上,幻燈片的其餘部分會變暗,突出顯示該區域。WPF中的不透明蒙版 - 排除圖形

當前,這些感興趣的區域是Path形狀,使用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 
    } 
} 

這繪製的形狀,其變的圖像區域周圍,然後返回到起點之前的給定形狀。

這種方法的問題是,它會產生非常奇怪的外觀形狀,而不透明蒙版的漸變似乎會使區域變白而不是使其餘部分變暗。

我並不太在意從黑暗逐漸轉變爲形狀,只要我能找到解決方案將會使形狀周圍的區域變暗,但仍然會顯示下面的幻燈片,我會很高興。提前致謝。

回答

2

使用由足夠大的RectangleGeometry和排除的PathGeometry組成的CombinedGeometry的半透明黑色路徑元素覆蓋圖像可能會更容易。

像這樣:

<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)。

+0

確切地說,我需要它。 「內在形狀」仍然看起來都搞砸了,但我相信這是一個單獨的問題,我可以制定出來。非常感謝! –

+0

@DanMcElroy不客氣。也許你不應該使用Geometry.Parse()來創建內部幾何體,而是使用PathGeometry或StreamGeometry API。如果內部形狀只是一個矩形,那麼RectangleGeometry更容易創建。 – Clemens