【问题标题】:DrawingBrush with transperancy透明画笔
【发布时间】:2015-11-17 15:52:00
【问题描述】:

我正在尝试创建具有透明度的 DrawingBrush,但无法弄清楚如何设置此透明度:( 这是 XAML:

<Border Grid.Column="1" Grid.Row="1" BorderBrush="Yellow" Background="Green">
        <Rectangle>
            <Rectangle.Fill>
                <DrawingBrush>
                    <DrawingBrush.Drawing>
                        <DrawingGroup>
                            <GeometryDrawing Brush="Red">
                                <GeometryDrawing.Geometry>
                                    <CombinedGeometry GeometryCombineMode="Exclude">
                                        <CombinedGeometry.Geometry1>
                                            <RectangleGeometry Rect="0, 0, 110, 110" />
                                        </CombinedGeometry.Geometry1>
                                        <CombinedGeometry.Geometry2>
                                            <RectangleGeometry Rect="10, 10, 90, 90" />
                                        </CombinedGeometry.Geometry2>
                                    </CombinedGeometry>
                                </GeometryDrawing.Geometry>
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Blue" Thickness=".3" />
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingGroup>
                    </DrawingBrush.Drawing>
                </DrawingBrush>
            </Rectangle.Fill>
        </Rectangle>
    </Border>

输出是:

  1. &lt;GeometryDrawing Brush="Red"&gt;
  2. &lt;Border Background="Green"&gt;

如何将画笔的背景颜色设置为 Transparent

如果我在 XAML (GeometryDrawing Brush="Transparent") 中设置它,那么画笔将从上层控件 Border 获取背景颜色,并且一切都将是绿色

主要思路是在control/Brush的中间中绘制Rectangle

【问题讨论】:

  • 我有点困惑你期望的最终结果是什么。你想让绿色部分完全透明吗?
  • @vcsjones Red 部分
  • 您将一个带有(部分)透明填充的矩形放入具有绿色背景的边框中。当然,您会通过透明部分看到绿色背景。你的期望是什么?你想达到什么目的?
  • @Clemens - 我正在尝试在控件中间绘制带有颜色的Rectangle。从Rectangle 到外边框(红色)的空间应该是透明的。
  • @Clemens 我不明白这个问题....我需要设置Rectangle 的颜色 - 如何?我设置了BorderBackground 画笔 - 这个DrawingBrush 仅在内部Rectangle 中绘制它,并将所有“红色”区域设置为透明。这就是想法

标签: c# wpf xaml


【解决方案1】:

来自您的评论:

DrawingBrush 仅在内部 Rectangle 中绘制它,并将所有“红色”区域设置为透明

这不是 WPF 中渲染模型的工作方式。当您在 XAML 中声明要绘制的内容时,您正在描述要呈现的对象集合。透明的颜色(即 alpha 值为 0,如内置的 Transparent 值)不会将其下的像素“设置”为透明;它根本不会渲染自身。在对象中使用透明颜色只会显示该对象下方的任何内容。

如果你想在你的边框内绘制一个本身由透明像素包围的绿色框,那么你根本不需要填充边框(因为它会通过透明像素显示),你需要定义一个Drawing 正是你想要的。 IE。一个透明的矩形来定义所需矩形的实际范围,然后是一个较小的填充矩形。

例如:

<Window x:Class="TestSO33761293InsetRectangleBorder.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="525" Width="525">

  <Window.Resources>
    <DrawingBrush x:Key="drawingBrush1">
      <DrawingBrush.Drawing>
        <DrawingGroup>
          <GeometryDrawing Brush="Green">
            <GeometryDrawing.Geometry>
              <RectangleGeometry Rect="10, 10, 90, 90" />
            </GeometryDrawing.Geometry>
            <GeometryDrawing.Pen>
              <Pen Brush="Blue" Thickness=".3" />
            </GeometryDrawing.Pen>
          </GeometryDrawing>
          <GeometryDrawing Brush="Transparent">
            <GeometryDrawing.Geometry>
              <RectangleGeometry Rect="0, 0, 110, 110" />
            </GeometryDrawing.Geometry>
          </GeometryDrawing>
        </DrawingGroup>
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Window.Resources>

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="2*"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="2*"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Border Grid.Column="1" Grid.Row="1" BorderBrush="Yellow" BorderThickness="1">
      <Rectangle Fill="{StaticResource drawingBrush1}"/>
    </Border>
  </Grid>
</Window>

【讨论】:

  • 很抱歉 - 我一定让这里的每个人都感到困惑 :( 在 Google 上搜索了很多之后,我明白我需要看看 OpacityMask 类似这样的东西:msdn.microsoft.com/library/ms743320(v=vs.100).aspx#Anchor_6 但你的答案完全正确我的问题。谢谢
  • 是的,您也可以使用OpacityMask。但请注意,同样的基本问题也适用:OpacityMask影响设置它的对象。例如,在上面的画笔中,您可能只有一个绿色矩形,但应用一个不透明蒙版,将外部 10 像素边框设置为透明。但是您仍然需要将此遮罩应用到Rectangle,它仍然不会影响在Rectangle 下绘制的任何内容(即除了让它显示之外)。
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 2021-11-12
  • 2013-04-05
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多