<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">wpf中原生的矩形可以通过设置RadiusX和RadiusY来实现圆角矩形的效果,但这样的矩形四个角都是圆角。</span>
但有时候我们需要一个矩形只有上面的有圆角,下面是直角。
解决办法就是自定义一个类继承图形类(Shape),定义相应的依赖属性,然后重写绘制方法即可。
具体代码如下:
public class PartiallyRoundedRectangle : Shape {
public static readonly DependencyProperty RadiusXProperty;
public static readonly DependencyProperty RadiusYProperty;
public static readonly DependencyProperty RoundTopLeftProperty;
public static readonly DependencyProperty RoundTopRightProperty;
public static readonly DependencyProperty RoundBottomLeftProperty;
public static readonly DependencyProperty RoundBottomRightProperty;
public int RadiusX {
get { return (int)GetValue(RadiusXProperty); }
set { SetValue(RadiusXProperty, value); }
}
public int RadiusY {
get { return (int)GetValue(RadiusYProperty); }
set { SetValue(RadiusYProperty, value); }
}
public bool RoundTopLeft {
get { return (bool)GetValue(RoundTopLeftProperty); }
set { SetValue(RoundTopLeftProperty, value); }
}
public bool RoundTopRight {
get { return (bool)GetValue(RoundTopRightProperty); }
set { SetValue(RoundTopRightProperty, value); }
}
public bool RoundBottomLeft {
get { return (bool)GetValue(RoundBottomLeftProperty); }
set { SetValue(RoundBottomLeftProperty, value); }
}
public bool RoundBottomRight {
get { return (bool)GetValue(RoundBottomRightProperty); }
set { SetValue(RoundBottomRightProperty, value); }
}
static PartiallyRoundedRectangle() {
RadiusXProperty = DependencyProperty.Register
("RadiusX", typeof(int), typeof(PartiallyRoundedRectangle));
RadiusYProperty = DependencyProperty.Register
("RadiusY", typeof(int), typeof(PartiallyRoundedRectangle));
RoundTopLeftProperty = DependencyProperty.Register
("RoundTopLeft", typeof(bool), typeof(PartiallyRoundedRectangle));
RoundTopRightProperty = DependencyProperty.Register
("RoundTopRight", typeof(bool), typeof(PartiallyRoundedRectangle));
RoundBottomLeftProperty = DependencyProperty.Register
("RoundBottomLeft", typeof(bool), typeof(PartiallyRoundedRectangle));
RoundBottomRightProperty = DependencyProperty.Register
("RoundBottomRight", typeof(bool), typeof(PartiallyRoundedRectangle));
}
public PartiallyRoundedRectangle() {
}
protected override Geometry DefiningGeometry {
get {
Geometry result = new RectangleGeometry
(new Rect(0, 0, base.Width, base.Height), RadiusX, RadiusY);
double halfWidth = base.Width / 2;
double halfHeight = base.Height / 2;
if (!RoundTopLeft)
result = new CombinedGeometry
(GeometryCombineMode.Union, result, new RectangleGeometry
(new Rect(0, 0, halfWidth, halfHeight)));
if (!RoundTopRight)
result = new CombinedGeometry
(GeometryCombineMode.Union, result, new RectangleGeometry
(new Rect(halfWidth, 0, halfWidth, halfHeight)));
if (!RoundBottomLeft)
result = new CombinedGeometry
(GeometryCombineMode.Union, result, new RectangleGeometry
(new Rect(0, halfHeight, halfWidth, halfHeight)));
if (!RoundBottomRight)
result = new CombinedGeometry
(GeometryCombineMode.Union, result, new RectangleGeometry
(new Rect(halfWidth, halfHeight, halfWidth, halfHeight)));
return result;
}
}
}
<custom:PartiallyRoundedRectangle RoundTopLeft="True"
RoundBottomRight="True" RadiusX="20" RadiusY="20"
Fill="LightBlue" Height="112" Width="200" />
通过设置RoundTopLeft、RoundTopRight、RoundBottomLeft、RoundBottonRight这四个属性来设置相应的圆角。
参考连接
WPF-PartiallyRoundedRectangle-Choose-Which-Corners