Я хочу создать пользовательский рендерер для моего элемента управления кадром, поскольку у него есть элемент управления, значения каждого радиуса которого уникальны,
Согласно вашему описанию, вы хотите выполнить пользовательский рендеринг. кадр, то вы можете установить другой радиус угла. Если да, я делаю один пример, который вы можете посмотреть:
Во-первых, создайте CustomFrame наследовать Frame, имеет BindableProperty CornerRadiusProperty.
public class CustomFrame:Frame
{
public static new readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CustomFrame), typeof(CornerRadius), typeof(CustomFrame));
public CustomFrame()
{
// MK Clearing default values (e.g. on iOS it's 5)
base.CornerRadius = 0;
}
public new CornerRadius CornerRadius
{
get => (CornerRadius)GetValue(CornerRadiusProperty);
set => SetValue(CornerRadiusProperty, value);
}
}
Затем перейдите на Android платформу,
using FrameRenderer = Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer;
[сборка: ExportRenderer (typeof (CustomFrame), typeof (CustomFrameRenderer))] пространство имен Framerender.Droid {publi c класс CustomFrameRenderer: FrameRenderer {publi c CustomFrameRenderer (контекстный контекст): база (контекст) ) {}
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);
if (e.NewElement != null && Control != null)
{
UpdateCornerRadius();
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(CustomFrame.CornerRadius) ||
e.PropertyName == nameof(CustomFrame))
{
UpdateCornerRadius();
}
}
private void UpdateCornerRadius()
{
if (Control.Background is GradientDrawable backgroundGradient)
{
var cornerRadius = (Element as CustomFrame)?.CornerRadius;
if (!cornerRadius.HasValue)
{
return;
}
var topLeftCorner = Context.ToPixels(cornerRadius.Value.TopLeft);
var topRightCorner = Context.ToPixels(cornerRadius.Value.TopRight);
var bottomLeftCorner = Context.ToPixels(cornerRadius.Value.BottomLeft);
var bottomRightCorner = Context.ToPixels(cornerRadius.Value.BottomRight);
var cornerRadii = new[]
{
topLeftCorner,
topLeftCorner,
topRightCorner,
topRightCorner,
bottomRightCorner,
bottomRightCorner,
bottomLeftCorner,
bottomLeftCorner,
};
backgroundGradient.SetCornerRadii(cornerRadii);
}
}
}
}
Теперь вы можете использовать CustomFrame в PCL.
<local:CustomFrame
BackgroundColor="Red"
CornerRadius="0,0,30,30"
HasShadow="True"
HeightRequest="100"
VerticalOptions="CenterAndExpand"
WidthRequest="100" />
Вот пример на Github, вы также можете посмотреть :
https://github.com/CherryBu/CustomFrame
Есть также одна статья о пользовательском кадре:
https://progrunning.net/customizing-corner-radius/