感谢您的帖子,这真是太棒了!
我已经修改以制作我自己的切角边框类和下面的相同用法
public class CornerCutBorder : Border
{
public CornerRadius CornerCutSize
{
get { return (CornerRadius)GetValue(CornerCutSizeProperty); }
set { SetValue(CornerCutSizeProperty, value); }
}
public static readonly DependencyProperty CornerCutSizeProperty = DependencyProperty.Register("CornerCutSize", typeof(CornerRadius),typeof(CornerCutBorder),new UIPropertyMetadata(new CornerRadius(), DogEarPropertyChanged));
private static void DogEarPropertyChanged(DependencyObject obj,DependencyPropertyChangedEventArgs e)
{
((CornerCutBorder)obj).Resized();
}
public CornerCutBorder()
{
this.SizeChanged += new SizeChangedEventHandler(Border_SizeChanged);
}
void Border_SizeChanged(object sender, SizeChangedEventArgs e)
{
Resized();
}
void Resized()
{
var clip = new PathGeometry();
clip.Figures = new PathFigureCollection();
RectangleGeometry rectangleGeometry = new RectangleGeometry(new Rect()
{
Width = this.ActualWidth,
Height = this.ActualHeight
});
clip.AddGeometry(rectangleGeometry);
if (CornerCutSize.TopLeft > 0)
{
clip.Figures.Add(
new PathFigure(
new Point(0, 0),
new[] {
new LineSegment(new Point(CornerCutSize.TopLeft, 0), true),
new LineSegment(new Point(0, CornerCutSize.TopLeft), true) },
true)
);
}
if (CornerCutSize.TopRight > 0)
{
clip.Figures.Add(
new PathFigure(
new Point(this.ActualWidth - CornerCutSize.TopRight, 0),
new[] {
new LineSegment(new Point(this.ActualWidth, 0), true),
new LineSegment(new Point(this.ActualWidth, CornerCutSize.TopRight), true) },
true)
);
}
if (CornerCutSize.BottomLeft > 0)
{
clip.Figures.Add(
new PathFigure(
new Point(0, this.ActualHeight - CornerCutSize.BottomLeft),
new[] {
new LineSegment(new Point(0, this.ActualHeight), true),
new LineSegment(new Point(CornerCutSize.BottomLeft, this.ActualHeight), true) },
true)
);
}
if (CornerCutSize.BottomRight > 0)
{
clip.Figures.Add(
new PathFigure(
new Point(this.ActualWidth - CornerCutSize.BottomRight, this.ActualHeight),
new[] {
new LineSegment(new Point(this.ActualWidth, this.ActualHeight), true),
new LineSegment(new Point(this.ActualWidth, this.ActualHeight-CornerCutSize.BottomRight), true) },
true)
);
}
this.Clip = clip;
}
}
<local:CornerCutBorder CornerCutSize="30,100,100,50" Width="600" Height="400" BorderThickness="2" Background="Red" ></local:CornerCutBorder>
Sample output