Karthik Rj
Karthik Rj

Reputation: 131

How to set corner radius for button in xamarin uwp by programatically?

I am having an grid holding in Button. I want to set corner radius for this button by programmatically in xamarin.uwp. If it possible means i want to set corner radius for Bottom left alone. Please suggest your ideas for this query.

Upvotes: 0

Views: 498

Answers (1)

Nico Zhu
Nico Zhu

Reputation: 32775

For your requirement, you could custom BottomLeft BindableProperty. then use it in your custom button render like the following.

Custom Forms buttom

public class MyButton : Button
{

    public static readonly BindableProperty BottomLeftProperty = BindableProperty.Create(
      propertyName: "BottomLeft",
      returnType: typeof(int),
      declaringType: typeof(MyButton),
      defaultValue: default(int));

    public int BottomLeft
    {
        get { return (int)GetValue(BottomLeftProperty); }
        set { SetValue(BottomLeftProperty, value); }
    }
}

CustomButtonRenderer.cs

public class CustomButtonRenderer : ButtonRenderer
{
    Windows.UI.Xaml.Controls.ContentPresenter _contentPresenter;
    MyButton _myElement;
    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    {
        base.OnElementChanged(e);
        if (Control == null)
        {
            SetNativeControl(new FormsButton());
        }
        if (e.NewElement != null)
        {
            Control.Loaded += Control_Loaded;
            _myElement = Element as MyButton;
        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == MyButton.BottomLeftProperty.PropertyName)
        {
            UpdateBottomLeftBorderRadius(_myElement.BottomLeft);
        }
    }

    private void Control_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        _contentPresenter = MyFindChildByName(Control, "ContentPresenter") as Windows.UI.Xaml.Controls.ContentPresenter;

        if (_myElement.IsSet(MyButton.BottomLeftProperty) && _myElement.BottomLeft != (int)MyButton.BottomLeftProperty.DefaultValue)
        {
            UpdateBottomLeftBorderRadius(_myElement.BottomLeft);
        }
    }

    private void UpdateBottomLeftBorderRadius(int bottomLeft)
    {
        if (_contentPresenter != null)
        {
            _contentPresenter.CornerRadius = new CornerRadius(0, 0, 0, bottomLeft);
        }

    }

    public static DependencyObject MyFindChildByName(DependencyObject parant, string ControlName)
    {
        int count = VisualTreeHelper.GetChildrenCount(parant);

        for (int i = 0; i < count; i++)
        {
            var MyChild = VisualTreeHelper.GetChild(parant, i);
            if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
                return MyChild;

            var FindResult = MyFindChildByName(MyChild, ControlName);
            if (FindResult != null)
                return FindResult;
        }
        return null;
    }

}

Usage

<local:MyButton x:Name="Hello" Text="hello" 
                WidthRequest="100" 
                HeightRequest="100"  
                Margin="0,100,0,0" 
                BottomLeft="15" 
                VerticalOptions="Center" 
                HorizontalOptions="Center" 
                Clicked="MyButton_Clicked"/>

enter image description here

For edit the bottom left property programatically.

HelloBtn.BottomLeft = 30;

Upvotes: 1

Related Questions