wpf / xaml中仅限角的边框

时间:2013-04-25 17:34:44

标签: wpf xaml border brush

在某些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,中间透明部分不占用空间。将Horizo​​ntalAlignment和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>

3 个答案:

答案 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)

径向渐变画笔可能会达到你想要的效果。将径向笔刷的中心设置为框的中心。从透明的中心色开始,从中心淡出到所需的“边框颜色”(黑色),然后将半径设置得足够大,使黑色只出现在角落里。

并确保将“渐变”设置得非常短 - 不要逐渐褪色,但要使其清晰。

如果你的尺寸正确,你会得到类似于下面说明的(效果不佳)的效果。红色框表示您的内容。那个盒子外面的一切都说明了你的角落会是什么样子。使“透明”部分的半径变大,使黑角变小。

最后;对于薄边框来说,这几乎看起来不错。如果你有一个厚边框,它会在角刷的“尖端”看起来很“有趣”。

enter image description here

<强>更新

以下是一些代码的实际示例:

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

这就是它的样子:

enter image description here

对于矩形形状(即不是完美的正方形),为了使角落保持相同的大小,您必须相应地缩放RadiusX和RadiusY值。它们应按宽/高比例缩放。

答案 2 :(得分:1)

这是一个有趣的问题,所以这是另一种可能性。我希望你同意这可以作为我之前的一个完全独立的答案......

您可以使用一组简单形状(包含在网格中)来实现所需的效果。将您的“内容”框叠加在4个黑色矩形的顶部,每个黑色矩形位于网格的适当角落。

这是我糟糕的油漆插图。再次,红色框表示您的内容。该红色框之外的任何内容都是用户将看到的边框。

enter image description here

代码的真实例子:

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

看起来像这样:

enter image description here

这样可以非常好地扩展;无论您的内容大小如何,角落边框的大小始终相同。此外,边框可以是您喜欢的任何厚度,而不像前面的径向笔刷答案那样看起来很“奇怪”。