Search code examples
wpfstylesgroupbox

WPF: label CornerRadius under Border


So this is my custom GroupBox:

<Grid Width="550" Height="140" Margin="20,0,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="20"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border BorderThickness="1,1,1,0" BorderBrush="Gray" CornerRadius="5,5,0,0" >
        <Label
            Height="25"
            Width="60"
            HorizontalAlignment="Left"
            Background="#FF7AA0CD"
            BorderBrush="Gray"
            BorderThickness="1"
            Foreground="Gainsboro"
            Content=" Options"
            Margin="10,-18,0,0"/>
    </Border>
    <Border Grid.Row="1" BorderThickness="1,0,1,1" BorderBrush="Gray" CornerRadius="0,0,5,5">
        <StackPanel Orientation="Vertical" Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
            <StackPanel Orientation="Horizontal" Margin="10,0,0,0" >
                <Label 
        Content="Interface: "
        Margin="0,3,0,0"/>
                <ComboBox
            MaxDropDownHeight="110"
            Style="{DynamicResource ComboBoxFlatStyle}"
            ItemsSource="{Binding interfaces}"
            Width="400"
            Height="28"
            SelectedIndex="1"
            FontSize="12"
            Margin="40,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10,2,0,0">
                <Label 
            Content="Capture filter:"
            Margin="0,3,0,0"/>
                <TextBox
            Name="tbSnifferFilter"
            Width="399"
            Height="28"
            TextChanged="tbSnifferFilter_TextChanged"
            LostFocus="tbSnifferFilter_LostFocus"
            Margin="21,0,0,0">
                    <TextBox.ToolTip>
                        <TextBlock>
                The expression selects which packets will be dumped.
                <LineBreak /> 
                If no expression is given, all packets on the net will be accepte,
                <LineBreak />
                Otherwise, only packets for which expression is `true' will be accepted.
                        </TextBlock>
                    </TextBox.ToolTip>
                </TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10,3,0,0">
                <Label 
        Content="Capture file:"
        Margin="0,3,0,0"/>
                <TextBox
            Name="tbSnifferCaptureFile"
            Width="365"
            Height="28"
            ToolTip="Capture file name."
            TextChanged="tbSnifferFilter_TextChanged"
            IsReadOnly="True"
            Margin="29,0,0,0"/>
                <Button
            Name="btnSaveCaptureFile"
            Content="..."
            Width="32"
            Height="28"
            ToolTip="Select a file to which captured data will be wirtten."                                    
            Click="btnSaveCaptureFile_Click"
            GotMouseCapture="btnSaveCaptureFile_GotMouseCapture"
            LostMouseCapture="btnSaveCaptureFile_LostMouseCapture"                                      
            Margin="3,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10,3,0,0">
                <Label 
            Content="Packet length:"
            Margin="0,1,0,0"/>
                <Controls:NumericUpDown
            Name="nudSnoplen" 
            Minimum="0" 
            Maximum="65535"
            Value="65535"
            StringFormat="N0"
            MinWidth="50"
            HideUpDownButtons="True"
            Width="20"
            Height="28"
            ToolTip="Length of the packet that has to be retained."
            Margin="19,0,0,0" />
                <Label
            Content="bytes"
            Margin="0,2,0,0"/>
                <CheckBox
            Name="cbPromiscuousMode"
            Content="Promiscuous mode"
            FontFamily="Ariel"
            VerticalAlignment="Top"
            IsChecked="True"
            Height="25"
            Margin="20,1,0,0">
                    <CheckBox.ToolTip>
                        <TextBlock>
                In normal operation, an adapter only captures packets from the network that,
                <LineBreak /> 
                are destined to it, the packets exchanged by other hosts are therefore ignored.
                <LineBreak />
                Instead, when the adapter is in promiscuous mode it captures all packets,
                <LineBreak />
                whether they are destined to it or not.
                        </TextBlock>
                    </CheckBox.ToolTip>
                </CheckBox>
            </StackPanel>
        </StackPanel>
    </Border>
</Grid>

enter image description here

So i want to set my Label CornerRadius and i try to put this Label inside another Border but it seems that The property "Child" can only be set once. Any suggestions how to round my Label corner ?

So i want to set my Label CornerRadius and i try to put this Label inside another Border but it seems that The property "Child" can only be set once. Any suggestions how to round my Label corner ?


Solution

  • Add the following to your Style and you'll get rounded edges on your Label. I arbitrarily set it to "3" below, but you can set it to whatever your needs dictate.

    <Window.Resources>
        <Style  x:Key="MyLabelStyle" TargetType="Label">
            <Setter Property="Template">
          <Setter.Value>
        <ControlTemplate TargetType="{x:Type Label}">
            <Border BorderBrush="{TemplateBinding BorderBrush}" 
                BorderThickness="{TemplateBinding BorderThickness}" 
                Background="{TemplateBinding Background}" 
                Padding="{TemplateBinding Padding}" 
                SnapsToDevicePixels="true" 
                CornerRadius="3">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
    </Setter>
        </Style>
    </Window.Resources>
    

    Add the above code into windows.resources and in your label Style="{StaticResource MyLabelStyle}"

    <Label Style="{StaticResource MyLabelStyle}"></Label>