有很多方法可以做到这一点,这里是一种避免为每个平台编写自定义渲染的方法......
使用NControl/Ngraphics您可以创建一个NControlView子类来绘制您的弹出窗口(即 iOS 弹出窗口)。然后,您可以将其嵌入到 XAML 中,并在定位、在其上添加控件、模糊背景等方面执行您需要的任何操作...
public class PopDownControl : NControlView
{
public PopDownControl()
{
BackgroundColor = Xamarin.Forms.Color.Transparent;
}
public static BindableProperty CornerRadiusProperty =
BindableProperty.Create(nameof(CornerRadius), typeof(int), typeof(PopDownControl), 0,
BindingMode.OneWay, null, (bindable, oldValue, newValue) =>
{
(bindable as PopDownControl).Invalidate();
});
public int CornerRadius
{
get { return (int)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}
public static BindableProperty InsetPositionProperty =
BindableProperty.Create(nameof(InsetPosition), typeof(int), typeof(PopDownControl), 0,
BindingMode.OneWay, null, (bindable, oldValue, newValue) =>
{
(bindable as PopDownControl).Invalidate();
});
public int InsetPosition
{
get { return (int)GetValue(InsetPositionProperty); }
set { SetValue(InsetPositionProperty, value); }
}
public override void Draw(ICanvas canvas, Rect rect)
{
base.Draw(canvas, rect);
var backgroundBrush = new SolidBrush(Colors.White);
var pen = new Pen(Colors.White, 2);
var width = rect.Width - CornerRadius;
var height = rect.Height;
var arcdia = CornerRadius * 2;
var inset = InsetPosition;
var insetWidth = 30;
canvas.DrawPath(
new PathOp[]
{
new MoveTo (arcdia + CornerRadius, CornerRadius),
new LineTo (inset, CornerRadius),
new LineTo (inset + (insetWidth / 2), 0),
new LineTo (inset + insetWidth, CornerRadius),
new LineTo (width-arcdia, CornerRadius),
new ArcTo (new Size (arcdia), false, true, new Point (width, arcdia + CornerRadius)),
new LineTo (width, height-arcdia),
new ArcTo (new Size (arcdia), false, true, new Point (width-arcdia, height)),
new LineTo (arcdia + CornerRadius, height),
new ArcTo (new Size (arcdia), false, true, new Point (CornerRadius, height-arcdia)),
new LineTo (arcdia / 2, arcdia + CornerRadius),
new ArcTo (new Size (arcdia), false, true, new Point (arcdia + CornerRadius, CornerRadius)),
new LineTo (arcdia + CornerRadius, CornerRadius),
new ClosePath(),
}, pen, backgroundBrush);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |