如何通过编程设置Xamarin UWP中按钮的拐角半径?

时间:2018-11-10 08:58:47

标签: xamarin xamarin.forms uwp xamarin.uwp

我在Button中拥有一个网格。我想通过在xamarin.uwp中以编程方式设置此按钮的拐角半径。如果可能的话,我想为左下角单独设置转角半径。请提出您关于此查询的想法。

1 个答案:

答案 0 :(得分:0)

根据您的要求,您可以自定义BottomLeft BindableProperty。然后在您的自定义按钮呈现中使用它,如下所示。

自定义表单按钮

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;
    }

}

用法

<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

用于以编程方式编辑左下角的属性。

HelloBtn.BottomLeft = 30;