gpt4 book ai didi

wpf - 如何在 wpf 中绘制带有方角的边框?

转载 作者:行者123 更新时间:2023-12-04 20:06:41 27 4
gpt4 key购买 nike

你知道,就像太空堡垒纸一样!我已经尝试了几次,但现在我很难过。我还没有走几何路线,所以我会尽可能地解释这一点。

我希望边框相当大,但包含固定大小的角,就像 CornerRadius 一样。我希望它们不是圆角,而是锥形,例如:

/---------\
| |
| |
\_________/

我对此做了两次尝试:
  • 我的第一次尝试试图操纵一个边界类。这不起作用,因为拉伸(stretch)形状会破坏几何形状和比例。
  • 第二次尝试更加开箱即用。字面上地。我创建了一个 3x3 网格并用 4 个边框填充,每个边框的厚度分别为 2,0,0,0 - 0,2,0,0 - 0,0,2,0 和 0,0,0,2。最后一步,是用一条线连接边界。这是我的问题所在....

  • 第一次尝试
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
    <Grid.Resources>
    <Style x:Key="MyPoly" TargetType="Polygon">
    <Setter Property="Points">
    <Setter.Value>
    <PointCollection>
    <Point X="0.10" Y="0.01"/>
    <Point X="0.50" Y="0.01"/>
    <Point X="0.60" Y="0.10"/>
    <Point X="0.60" Y="0.50"/>
    <Point X="0.50" Y="0.60"/>
    <Point X="0.10" Y="0.60"/>
    <Point X="0.01" Y="0.50"/>
    <Point X="0.01" Y="0.10"/>
    </PointCollection>
    </Setter.Value>
    </Setter>
    </Style>
    </Grid.Resources>
    <Border
    Width="100"
    Height="100"
    BorderBrush="Black"
    BorderThickness="3"
    CornerRadius="5"/>
    <Grid Width="400"
    Height="300">
    <Polygon
    Stroke="Purple"
    StrokeThickness="2"
    Style="{StaticResource MyPoly}" Stretch="Fill">
    <Polygon.Fill>
    <SolidColorBrush Color="Blue" Opacity="0.4"/>
    </Polygon.Fill>
    <Polygon.LayoutTransform>
    <ScaleTransform ScaleX="1" ScaleY="1"/>
    </Polygon.LayoutTransform>
    </Polygon>
    </Grid>
    </Grid>
    </Page>

    第二次尝试
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" SnapsToDevicePixels="True">
    <Grid>
    <Grid.Resources>
    </Grid.Resources>
    <Grid Width="200" Height="350" SnapsToDevicePixels="True">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="10"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
    <RowDefinition Height="10"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="10"/>
    </Grid.RowDefinitions>
    <Border Grid.Column="0" Grid.Row="1" Margin="0" BorderBrush="Red" BorderThickness="2,0,0,0" Padding="0" SnapsToDevicePixels="True"/>
    <Border BorderThickness="1" BorderBrush="Black">
    <Line SnapsToDevicePixels="True" Stretch="Fill" Stroke="Red" StrokeThickness="2" X1="0" X2="1" Y1="1" Y2="0">
    </Line>
    </Border>
    <Border Grid.Column="1" Grid.Row="0" BorderBrush="Red" BorderThickness="0,2,0,0" SnapsToDevicePixels="True"/>
    <Border Grid.Column="2" Grid.Row="1" BorderBrush="Red" BorderThickness="0,0,2,0" SnapsToDevicePixels="True"/>
    <Border Grid.Column="1" Grid.Row="2" BorderBrush="Red" BorderThickness="0,0,0,2" SnapsToDevicePixels="True"/>
    </Grid>
    </Grid>
    </Page>

    线设置为缩放到网格大小。将线属性设置为 X1="0" X2="1" Y1="1" Y2="0"并使用 Stretch="Fill"将 Line 扩展到边缘。但是,它最终看起来像这样:

    (很烦人,我不能发布图片,我需要去回答别人的问题以获得一些代表。所以请转至此链接查看该行,或将上述 XAML 粘贴到 Kaxaml 中。)
    http://img375.imageshack.us/img375/1996/border1.png

    我在承载 Line 的 Grid 元素周围画了一个洋红色边框,以使问题更加明显。

    如何扩展线条以真正填补空白(例如通过扩大网格内的可绘制区域),或者, 有没有更好的办法?

    此外,变换会扭曲线条,使其更粗。我尝试扩大规模,但没有一致性。线上的端盖看起来同样糟糕(例如三角形)。

    最后,这种方法还是有缺陷的,因为我希望以后能够设置角的大小,所以将行/列的边缘宽度设置为 10 似乎是一个绊脚石。绑定(bind)到属性可能会解决这个问题,但我从来没有在 Style 中这样做过。

    感谢阅读,汤姆

    最佳答案

    WPF 边框继承自 Decorator 类。编写自己的装饰器非常容易。下面的一个在一个 child 周围画了一个边框,“塞进”了角落。

    class FunkyBorder : Decorator
    {
    public Brush BorderBrush
    {
    get { return (Brush)GetValue(BorderBrushProperty); }
    set { SetValue(BorderBrushProperty, value); }
    }

    public static readonly DependencyProperty BorderBrushProperty =
    DependencyProperty.Register("BorderBrush",
    typeof(Brush),
    typeof(FunkyBorder),
    new UIPropertyMetadata(Brushes.Transparent));

    protected override void OnRender(DrawingContext drawingContext)
    {
    // TODO, make pen thickness and corner width (currently 10) into dependency properties.
    // Also, handle case when border don't fit into given space without overlapping.

    if (_pen.Brush != BorderBrush)
    {
    _pen.Brush = BorderBrush;
    }

    drawingContext.DrawLine(_pen, new Point(0, 10), new Point(10, 0));
    drawingContext.DrawLine(_pen, new Point(10, 0), new Point(ActualWidth - 10, 0));
    drawingContext.DrawLine(_pen, new Point(ActualWidth - 10, 0), new Point(ActualWidth, 10));
    drawingContext.DrawLine(_pen, new Point(0, 10), new Point(0, ActualHeight - 10));
    drawingContext.DrawLine(_pen, new Point(ActualWidth, 10), new Point(ActualWidth, ActualHeight - 10));
    drawingContext.DrawLine(_pen, new Point(0, ActualHeight - 10), new Point(10, ActualHeight));
    drawingContext.DrawLine(_pen, new Point(10, ActualHeight), new Point(ActualWidth - 10, ActualHeight));
    drawingContext.DrawLine(_pen, new Point(ActualWidth - 10, ActualHeight), new Point(ActualWidth, ActualHeight - 10));
    }

    private Pen _pen = new Pen(Brushes.Transparent, 2);
    }

    像这样使用:
       <BorderTest:FunkyBorder BorderBrush="Red">
    <TextBlock Text="Hello" />
    </BorderTest:FunkyBorder>

    关于wpf - 如何在 wpf 中绘制带有方角的边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678426/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com