首页 文章

wpf / xaml中仅限角的边框

提问于
浏览
3

在某些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 回答

  • 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

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

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

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

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

    enter image description here

    Update:

    这是一些代码的实际示例:

    <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值 . 它们应该按宽/高比例缩放 .

  • 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

    这具有扩展性能的额外好处;无论您的内容大小如何,角落边框的大小始终相同 . 此外,边框可以是您喜欢的任何厚度,而不像前面的径向笔刷答案那样看起来像“怪异” .

相关问题