在某些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更改边框。出于这个原因,我也不能在边界内(边界内等)做边界。
编辑#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也没有做任何事情。
编辑#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>
答案 0 :(得分:2)
您可以使用Path
...这会绘制类似于您所需的内容:
<Path Stroke="Black" Stretch="Fill"
Data="M0,0 l10,0 m80,0 l10,0 m0,0 l0,10 m0,80 l0,10 m0,0 l-10,0 m-80,0 l-10,0 m0,0 l0,-10 m0,-80 l0,-10"
Height="100" Width="100" Margin="10" />
完整代码示例:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Path Stroke="Black" Stretch="Fill"
Data="M0,0 l10,0 m80,0 l10,0 m0,0 l0,10 m0,80 l0,10 m0,0 l-10,0 m-80,0 l-10,0 m0,0 l0,-10 m0,-80 l0,-10"
Height="100" Width="100" Margin="10" />
</Grid>
</Window>
答案 1 :(得分:1)
径向渐变画笔可能会达到你想要的效果。将径向笔刷的中心设置为框的中心。从透明的中心色开始,从中心淡出到所需的“边框颜色”(黑色),然后将半径设置得足够大,使黑色只出现在角落里。
并确保将“渐变”设置得非常短 - 不要逐渐褪色,但要使其清晰。
如果你的尺寸正确,你会得到类似于下面说明的(效果不佳)的效果。红色框表示您的内容。那个盒子外面的一切都说明了你的角落会是什么样子。使“透明”部分的半径变大,使黑角变小。
最后;对于薄边框来说,这几乎看起来不错。如果你有一个厚边框,它会在角刷的“尖端”看起来很“有趣”。
<强>更新强>
以下是一些代码的实际示例:
<Border BorderThickness="1" Height="100" Width="100">
<Border.BorderBrush>
<RadialGradientBrush RadiusX="0.6" RadiusY="0.6">
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="#00000000" Offset="0.99"/>
</RadialGradientBrush>
</Border.BorderBrush>
<Rectangle Fill="Red" />
</Border>
这就是它的样子:
对于矩形形状(即不是完美的正方形),为了使角落保持相同的大小,您必须相应地缩放RadiusX和RadiusY值。它们应按宽/高比例缩放。
答案 2 :(得分:1)
这是一个有趣的问题,所以这是另一种可能性。我希望你同意这可以作为我之前的一个完全独立的答案......
您可以使用一组简单形状(包含在网格中)来实现所需的效果。将您的“内容”框叠加在4个黑色矩形的顶部,每个黑色矩形位于网格的适当角落。
这是我糟糕的油漆插图。再次,红色框表示您的内容。该红色框之外的任何内容都是用户将看到的边框。
代码的真实例子:
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="300" Height="200">
<!-- These rectangles will be the four corner "borders" -->
<Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top" />
<Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
<Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Right" VerticalAlignment="Top" />
<Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
<!-- Here is the content. The "margin" property will effectively be the thickness of your corner borders. -->
<Rectangle Fill="Red" Margin="2" />
</Grid>
看起来像这样:
这样可以非常好地扩展;无论您的内容大小如何,角落边框的大小始终相同。此外,边框可以是您喜欢的任何厚度,而不像前面的径向笔刷答案那样看起来很“奇怪”。