Suryakavitha
Suryakavitha

Reputation: 1411

How to apply Border to Button control programmatically using C#

I am creating a Button control using C# as mentioned below in the code. I have created the rounded border for the button style. I am not able to see any property to assign the Border in the button.

   var button = new System.Windows.Controls.Button
        {
            Name = "BtnOk",
            Content = "OK",
            Height = 20,
            Width = 60,
            HorizontalAlignment = HorizontalAlignment.Center,
            Background = Brushes.DarkGray,
            Foreground = Brushes.WhiteSmoke,
            Margin = new Thickness(0,0,0,5)
        };

   Border border = new Border();
        border.CornerRadius = new CornerRadius(3);

How can I apply Border in button programatically?

Upvotes: 0

Views: 1744

Answers (2)

mm8
mm8

Reputation: 169160

There is indeed a Border element in the default ControlTemplate for the Button but the easiest way to set the CornerRadius property of it, without having to define a custom template, is to wait until the Button has been loaded and then get a reference to it. Try this:

var button = new System.Windows.Controls.Button
{
    Name = "BtnOk",
    Content = "OK",
    Height = 20,
    Width = 60,
    HorizontalAlignment = HorizontalAlignment.Center,
    Background = Brushes.DarkGray,
    Foreground = Brushes.WhiteSmoke,
    Margin = new Thickness(0, 0, 0, 5)
};
button.Loaded += (ss, ee) =>
{
    Border border = button.Template.FindName("border", button) as Border;
    if (border != null)
        border.CornerRadius = new CornerRadius(3);
};

Upvotes: 1

ASh
ASh

Reputation: 35646

a button cannot aplly a border. a border can decorate a button:

border.Child = button;

usually Buttons already have a Border inside their Template (ControlTemplate). that Border isn't easily accessible - there is no special property of Button class, but that border can be found in visual tree after template was loaded.

additionally that Border can be customized by default style if you put it in Button.Resources. change CorderRadius using Style.Setter:

var button = new System.Windows.Controls.Button
{
    Name = "BtnOk",
    Content = "OK",
    Height = 20,
    Width = 60,
    HorizontalAlignment = HorizontalAlignment.Center,
    Background = Brushes.DarkGray,
    Foreground = Brushes.WhiteSmoke,
    Margin = new Thickness(0, 0, 0, 5)
};

var style = new Style
{
    TargetType = typeof(Border),
    Setters = { new Setter { Property = Border.CornerRadiusProperty, Value = new CornerRadius(3) } }
};

button.Resources.Add(style.TargetType, style);

or using object/collection initializers:

var button = new System.Windows.Controls.Button
{
    Name = "BtnOk",
    Content = "OK",
    Height = 20,
    Width = 60,
    HorizontalAlignment = HorizontalAlignment.Center,
    Background = Brushes.DarkGray,
    Foreground = Brushes.WhiteSmoke,
    Margin = new Thickness(0, 0, 0, 5),
    Resources =
    {
        {
            typeof(Border), new Style
            {
                TargetType = typeof(Border),
                Setters =
                {
                    new Setter { Property = Border.CornerRadiusProperty, Value = new CornerRadius(13) }
                }
            }
        }
    }
};

if many buttons should have different CornerRadius, changing Button's Template can be a solution. Change template and set CornerRadius as attached dependency property, like shown in this post: Set a property of a nested element in an WPF style

Upvotes: 3

Related Questions