Create Rounded Toggle Button in WPF

Rustam Hajiyev

I want to create ToggleButton which have CornerRadius DependencyProperty that bound to it's Borders' CornerRadius in standard template. My steps:

In Blend I just dropped ToggleButton on the MainWindow then using context menu selected "Make Into UserControl". In Code behind I created my DependencyProperty CornerRadius:

public partial class RoundedToggleButton : UserControl
{
    public RoundedToggleButton()
    {
        InitializeComponent();   
    }

    [Category("Appearance")]
    public CornerRadius CornerRadius
    {
        get { return (CornerRadius)GetValue(CornerRadiusProperty); }
        set { SetValue(CornerRadiusProperty, value); }
    }

    public static readonly DependencyProperty CornerRadiusProperty =
        DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(RoundedToggleButton), new PropertyMetadata(new CornerRadius()));
}

Then I created Template using "Edit Template -> Edit a copy.." and put it in the same place with my UserControl definition and added template binding:

<UserControl x:Class="SqlDeploymentTool.RoundedToggleButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:SqlDeploymentTool"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="19.96"
         d:DesignWidth="76.257"
         mc:Ignorable="d">
<UserControl.Resources>
    <Style x:Key="FocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2"
                               SnapsToDevicePixels="true"
                               Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
                               StrokeDashArray="1 2"
                               StrokeThickness="1" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD" />
    <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070" />
    <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD" />
    <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1" />
    <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6" />
    <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B" />
    <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4" />
    <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5" />
    <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383" />
    <Style x:Key="RoundedToggleButtonStyle" TargetType="{x:Type ToggleButton}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" />
        <Setter Property="Background" Value="{StaticResource Button.Static.Background}" />
        <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}" />
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Padding" Value="1" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="border"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="{TemplateBinding local:RoundedToggleButton.CornerRadius}"
                            SnapsToDevicePixels="true">
                        <ContentPresenter x:Name="contentPresenter"
                                          Margin="{TemplateBinding Padding}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          Focusable="False"
                                          RecognizesAccessKey="True"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Button.IsDefaulted" Value="true">
                            <Setter TargetName="border" Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource Button.MouseOver.Background}" />
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource Button.MouseOver.Border}" />
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource Button.Pressed.Background}" />
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource Button.Pressed.Border}" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource Button.Disabled.Background}" />
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource Button.Disabled.Border}" />
                            <Setter TargetName="contentPresenter" Property="TextElement.Foreground" Value="{StaticResource Button.Disabled.Foreground}" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid>
    <ToggleButton x:Name="toggleButton"
                  Content="ToggleButton"
                  Style="{DynamicResource RoundedToggleButtonStyle}" />

</Grid>

In Property Window I get the CornerRadius Property but it's not affected to the button's border. How can I solve this?

almulo

To be honest, making a custom control instead of a UserControl would have been more simple and straight-forward than this.

Create a class named RoundedToggleButton that inherits from ToggleButton and include your CornerRadius DependencyProperty on it. And then create a default Style (with no x:Key, just the TargetType) similar to the one you have there, but changing all the TargetTypes to RoundedToggleButton instead of ToggleButton.

In that case, this line...

CornerRadius="{TemplateBinding local:RoundedToggleButton.CornerRadius}"

... Would be simply:

CornerRadius="{TemplateBinding CornerRadius}"

And most important, it'd work!

BUT since you've already gone all the way to create the UserControl, simply change that line for:

CornerRadius="{Binding CornerRadius, RelativeSource={RelativeSource 
                       AncestorType={x:Type local:RoundedToggleButton}}}"

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Create Rounded Toggle Button in WPF

From Dev

How to create a rounded corner button in wpf from Styles?

From Java

Create a button with rounded border

From Dev

Toggle button in WPF

From Dev

Toggle button in WPF

From Dev

Circle to rounded triangle (menu button toggle)

From Dev

Circle to rounded triangle (menu button toggle)

From Dev

Create a toggle button

From Dev

Create a toggle button with RxJS

From Dev

Create an toggle / sliding button

From Dev

Code design for a toggle button in WPF

From Dev

WPF - make rounded button larger in mouse hover

From Dev

Create a ListView with VerticalScroll and Rounded corners in WPF

From Dev

How to create transparent rounded button in android?

From Dev

How to create a tkinter toggle button?

From Dev

How to Create multiple Toggle button

From Dev

Create Toggle Button Using jQuery

From Dev

Removing outer border of toggle button wpf

From Dev

How to hide toggle button from Expander in WPF

From Dev

How to hide toggle button from Expander in WPF

From Dev

How to choose one of two toggle button in WPF?

From Java

Create a rounded button / button with border-radius in Flutter

From Dev

WPF Rounded border button responsive to click color change

From Dev

Style WPF radio button as toggle button with correct IsEnabled behaviour

From Java

Android: Create a toggle button with image and no text

From Dev

Adding a JMenuItem to JMenuBar to create a toggle button in menu

From Dev

Create toggle button behaviour to hide or show div

From Dev

Create button in Facebook API to show/hide (toggle)

From Dev

How to create toggle switch button in qt designer?