在某些xaml中,我想要一个边界,每个角落只有几个像素 . 因此,沿着顶部,边界将是,例如,左边缘的黑色5像素,然后在顶部的其余部分透明,直到右边缘的5个像素,然后是边缘的最后5个像素 . 右边缘会是黑色的 . 目的是为偶尔选择透明的东西提供一些指导;然而,在这个应用中,全边界的存在会干扰内容(在感知 - 视觉上) . 角落不圆 .
看起来像这样的东西:
-- --
| |
| |
-- --
我应该用什么类型的刷子来达到这个效果?
我尝试过线性渐变,如下所示:
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="Black" Offset="0.01" />
<GradientStop Color="Transparent" Offset="0.0101" />
<GradientStop Color="Transparent" Offset="0.9899" />
<GradientStop Color="Black" Offset="0.99" />
<GradientStop Color="Black" Offset="1" />
</LinearGradientBrush>
当然,这只是左上角和右下角 . 这对于预期的应用来说可能是合理的,但是如果边界区域是正方形,则每个角上的线的大小是相同的(例如,如果边界区域是长矩形,则边界的部分沿着一个边缘进一步延伸一边比另一边) .
我确实注意到渐变画笔上的MappingMode值为“Absolute” . 这适用于左上角但不适用于其他角落 .
我也尝试了一个RadialGradientBrush,认为我可以得到一个圆环击中角落,但是没有成功地使它正确居中或者沿着两侧达到相同的长度 .
这是ListBox中ItemContainerStyle的一部分,并且使用Trigger for IsSelected更改边框 . 出于这个原因,我也不能在边界内(边界内等)做边界 .
Edit #2: 我也试过一个VisualBrush . 我知道我可以在网格中获得我想要的行为(至少是拉伸行为) .
<VisualBrush Stretch="Fill">
<VisualBrush.Visual>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10" MaxWidth="10" MinWidth="10" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" MaxWidth="10" MinWidth="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" MaxHeight="10" MinHeight="10" />
<RowDefinition Height="*" />
<RowDefinition Height="10" MaxHeight="10" MinHeight="10" />
</Grid.RowDefinitions>
<Rectangle Grid.Column="0" Grid.Row="0" Fill="Black" />
<Rectangle Grid.Column="1" Grid.Row="0" Fill="Transparent" />
<Rectangle Grid.Column="2" Grid.Row="0" Fill="Black" />
<Rectangle Grid.Column="0" Grid.Row="1" Fill="Transparent" />
<Rectangle Grid.Column="1" Grid.Row="1" Fill="Transparent" />
<Rectangle Grid.Column="2" Grid.Row="1" Fill="Transparent" />
<Rectangle Grid.Column="0" Grid.Row="2" Fill="Black" />
<Rectangle Grid.Column="1" Grid.Row="2" Fill="Transparent" />
<Rectangle Grid.Column="2" Grid.Row="2" Fill="Black" />
</Grid>
</VisualBrush.Visual>
</VisualBrush>
但是,这也没有用 . 看起来大小不会在画笔中以相同的方式发生 . 在这种情况下,VisualBrush中Grid的大小最终为20x20,中间透明部分不占用空间 . 将HorizontalAlignment和VerticalAlignment设置为Stretch也没有帮助 . Stretch =“填充”VisualBrush也没有做任何事情 .
Edit #1 :更广泛的背景:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
</Style.Resources>
<Setter Property="Margin" Value="3" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderThickness" Value="5" />
<Setter Property="Padding" Value="0" />
<Setter Property="BorderBrush" Value="Fuchsia" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="4" />
<Setter Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="Black" Offset="0.01" />
<GradientStop Color="Transparent" Offset="0.0101" />
<GradientStop Color="Transparent" Offset="0.9899" />
<GradientStop Color="Black" Offset="0.99" />
<GradientStop Color="Black" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
3 回答
您可以使用
Path
...这将绘制类似于您正在寻找的东西:完整代码示例:
径向渐变画笔可能会达到你想要的效果 . 将径向笔刷的中心设置为框的中心 . 从透明的中心色开始,从中心淡出到所需的“边框颜色”(黑色),然后将半径设置得足够大,使黑色仅显示在角落中 .
并确保将“渐变”设置得非常短 - 不要逐渐褪色,但要使其清晰 .
如果你的尺寸正确,你会得到类似于下面说明的(效果不佳)的效果 . 红色框表示您的内容 . 那个盒子外面的一切都说明了你的角落会是什么样子 . 使“透明”部分的半径更大,使黑色角落更小 .
最后;对于薄边框来说,这几乎看起来不错 . 如果你有一个厚边框,它会在角刷的“尖端”看起来“有趣” .
Update:
这是一些代码的实际示例:
这是它的样子:
对于矩形形状(即不是完美的正方形),为了使角落保持相同的大小,您必须相应地缩放RadiusX和RadiusY值 . 它们应该按宽/高比例缩放 .
这是一个有趣的问题,所以这是另一种可能性 . 我希望你同意这个问题可以作为我之前完全独立的答案......
您可以使用一组简单形状(包含在网格中)来实现所需的效果 . 将“内容”框叠加在4个黑色矩形的顶部,每个黑色矩形位于网格的适当角落 .
这是我糟糕的油漆插图 . 再次,红色框表示您的内容 . 该红色框外的任何内容都是用户将看到的边框 .
以及代码的真实示例:
它看起来像这样:
这具有扩展性能的额外好处;无论您的内容大小如何,角落边框的大小始终相同 . 此外,边框可以是您喜欢的任何厚度,而不像前面的径向笔刷答案那样看起来像“怪异” .