WPF コントロールの一部を正確な位置で強調表示する不透明マスクを設定する必要があるとします ((50;50) の位置に 50x50 の正方形があるとします)。そのために、2 つの GeometryDrawing オブジェクトを含む DrawingGroup を作成します。コントロールの実際のサイズ全体を表す半透明の四角形が 1 つと、強調表示された領域を表す不透明な四角形が 1 つです。次に、この DrawingGroup から DrawingBrush を作成し、その Stretch プロパティを None に設定し、このブラシをマスクする必要があるコントロールの OpacityMask として設定します。
上記の制御の範囲外に「突き出ている」ものは何もありませんが、これはすべて正常に機能します。しかし、コントロールがその境界の外側に何かを描画すると、外側の点が不透明マスクが適用される開始点になり (ブラシがその側に配置されている場合)、マスク全体がその距離だけシフトし、予期しない動作が発生します。
コントロールの境界からマスクを強制的に適用する方法、または少なくともコントロールの実際の境界 (固着部分を含む) を取得する方法が見つからないように見えるので、それに応じてマスクを調整できます。
どんなアイデアでも大歓迎です!
更新:これは、問題を示す簡単なテスト ケース XAML とスクリーンショットです。
上記の正方形の最後のものには、2 つの入れ子になった Borders と Canvas があります。
<Border Padding="20" Background="DarkGray" Width="240" Height="240">
<Border Background="LightBlue">
<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="50" Height="50"
Stroke="Red" StrokeThickness="2"
Fill="White"
/>
</Canvas>
</Border>
</Border>
外観は次のとおりです。
(出典: ailon.org )
次に、2 番目の境界線に OpacityMask を追加して、正方形を除くすべての部分が半透明になるようにします。
<Border.OpacityMask>
<DrawingBrush Stretch="None" AlignmentX="Left" AlignmentY="Top">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="#30000000">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,200,200" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Brush="Black">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="50,50,50,50" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Border.OpacityMask>
すべてが期待どおりに見えます:
(出典: ailon.org )
次に、境界線の左側に 10 ピクセルを突き出す線をキャンバスに追加します。
<Line X1="-10" Y1="150" X2="120" Y2="150"
Stroke="Red" StrokeThickness="2"
/>
マスクは左に 10 ピクセルシフトします。
(出典: ailon.org )
Update2 : 回避策として、境界の外側に途方もなく大きな透明な四角形を追加し、それに応じてマスクを調整しますが、これは本当に厄介な回避策です。
Update3 : 注: 長方形と線を含むキャンバスは、境界の外側に何かがあるオブジェクトの例としてあります。このサンプルのコンテキストでは、ある種のブラック ボックスとして扱う必要があります。一般的な問題を解決するためにプロパティを変更することはできません。これは、はみ出さないように線を移動するのと同じです。