如何在WPF按钮中获取按钮边框和一半椭圆形样式?

时间:2013-11-13 07:54:09

标签: c# wpf button styles

我试图在wpf中创建一个按钮样式。但我遇到了问题。

1)按钮内部样式需要一半的椭圆形。 enter image description here

2)金色按钮边框&颜色#872234 enter image description here

我的XAML代码 -

<Window x:Class="Kiosk_Testing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">  

                        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="False">
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <!-- the background for the button -->
                            <Rectangle RadiusX="20" RadiusY="30" Grid.RowSpan="2">
                                <Rectangle.Fill>
                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Color="#872234" Offset="0"/>
                                            <GradientStop Color="#872234" Offset="0.9"/>
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <!-- the "gel" hilight at the top of the button -->
                            <Rectangle RadiusX="20" RadiusY="30" Margin="5">
                                <Rectangle.Fill>
                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Color="#C53550" Offset="0.1"/>
                                            <GradientStop Color="#C43551" Offset="0.5"/>
                                            <GradientStop Color="#C43551" Offset="0.9"/>
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <!-- place for the content inside the button to be displayed -->
                            <ContentPresenter Grid.RowSpan="2"   
                                  x:Name="PrimaryContent"
                                  HorizontalAlignment="Center" VerticalAlignment="Center"
                                  Margin="{TemplateBinding Padding}" 
                                  Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" 
                                  />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Foreground" Value="gold" />            
        </Style>
    </Window.Resources>
    <Grid>
        <Button BorderThickness="50" HorizontalAlignment="Center" Content="Button" FontSize="26" FontFamily="Times New Roman" VerticalAlignment="Center" Width="163" Height="58" Margin="146,168,194,85">
            <Button.BorderBrush>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Color="Gold" Offset="0.1"/>
                        <GradientStop Color="#C43551" Offset="0.5"/>
                        <GradientStop Color="Gold" Offset="0.9"/>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Button.BorderBrush>
        </Button>
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:3)

如果您使用Border代替Rectangle选项,则可以使用以下Border XAML替换Rectangle XAML:

<Border Margin="5" CornerRadius="14,14,4,4">
    <Border.Background>
        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="#C53550" Offset="0.1"/>
                <GradientStop Color="#C43551" Offset="0.5"/>
                <GradientStop Color="#C43551" Offset="0.9"/>
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    </Border.Background>
</Border>

您可以调整CornerRadius属性以获得所需的圆角。

完整风格:

<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">  

                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="False">
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <!-- the background for the button -->
                    <Rectangle RadiusX="20" RadiusY="30" Grid.RowSpan="2">
                        <Rectangle.Fill>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                <LinearGradientBrush.GradientStops>
                                    <GradientStop Color="#872234" Offset="0"/>
                                    <GradientStop Color="#872234" Offset="0.9"/>
                                </LinearGradientBrush.GradientStops>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                    <!-- the "gel" hilight at the top of the button -->
                    <Border Margin="5" CornerRadius="14,14,4,4">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                <LinearGradientBrush.GradientStops>
                                    <GradientStop Color="#C53550" Offset="0.1"/>
                                    <GradientStop Color="#C43551" Offset="0.5"/>
                                    <GradientStop Color="#C43551" Offset="0.9"/>
                                </LinearGradientBrush.GradientStops>
                            </LinearGradientBrush>
                        </Border.Background>
                    </Border>
                    <!-- place for the content inside the button to be displayed -->
                    <ContentPresenter Grid.RowSpan="2"   
                          x:Name="PrimaryContent"
                          HorizontalAlignment="Center" VerticalAlignment="Center"
                          Margin="{TemplateBinding Padding}" 
                          Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" 
                          />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="gold" />            
</Style>

结果图:

enter image description here

<强>更新

我想,你希望你的按钮也有金色边框。更新了金色边框风格:

<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">  
                <Border BorderThickness="2" CornerRadius="28" BorderBrush="GoldenRod">
                    <Border BorderThickness="2" CornerRadius="27">

                         <Border.BorderBrush>
                              <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" >
                                                <LinearGradientBrush.GradientStops>
                                                    <GradientStop Color="Gold" Offset="0"/>
                                                    <GradientStop Color="Wheat" Offset="0.6"/>
                                                    <GradientStop Color="Gold" Offset="0.9"/>
                                                </LinearGradientBrush.GradientStops>
                                            </LinearGradientBrush>     
                        </Border.BorderBrush>
                    <Border BorderThickness="2" CornerRadius="26" BorderBrush="Gold">

                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="False">
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <!-- the background for the button -->
                        <Rectangle RadiusX="20" RadiusY="30" Grid.RowSpan="2">
                            <Rectangle.Fill>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStop Color="#872234" Offset="0"/>
                                        <GradientStop Color="#872234" Offset="0.9"/>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>
                        <!-- the "gel" hilight at the top of the button -->
                        <Border Margin="5" CornerRadius="14,14,4,4">
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStop Color="#C53550" Offset="0.1"/>
                                        <GradientStop Color="#C43551" Offset="0.5"/>
                                        <GradientStop Color="#C43551" Offset="0.9"/>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                            </Border.Background>
                        </Border>

                        <!-- place for the content inside the button to be displayed -->
                        <ContentPresenter Grid.RowSpan="2"   
                              x:Name="PrimaryContent"
                              HorizontalAlignment="Center" VerticalAlignment="Center"
                              Margin="{TemplateBinding Padding}" 
                              Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" 
                              />
                    </Grid>
                </Border>
            </Border>
        </Border>
        </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="gold" />            
</Style>

Thats the closest I could get