C# WPF 按钮模板

15 篇文章 4 订阅

    C# WPF的交互界面编程相较于MFC强大且方便的多,以至于用惯了MFC的我刚开始学时有点不知所措,所幸经过一段时间摸索,终于有些明白了。
    就拿做一个按钮模板为例:
在直接从工具箱拖下来没有修改的情况下,按钮的视觉效果大概是如下图所示的样子:

普通按钮视觉效果图

    如果是一个交给用户使用的程序,这样的界面怎么看都是粗糙的。在WPF中,可以通过在xaml文件中编写如下的按钮模板,将按钮的样式完全改变。模板的代码如下(具体的解释都已经在代码的注释中给出):

<Window.Resources>
<!--设置模板目标为Button,而x:Key为其模板名称,按钮对象要应用该模板风格需要设置相应的Style属性与
 x:Key指定的名称绑定,如下面的实例。如果模板没有显式赋值x:Key对象,则所有Button都具有该模板的风格-->
    <Style TargetType="{x:Type Button}" x:Key="WhiteButton">
        <!--设置按钮背景色为透明-->
        <Setter Property="Control.Background"  Value="{x:Null}"/>
        <!--设置按钮为无边框样式-->
        <Setter Property="Control.BorderBrush" Value="{x:Null}"/>
        <!--设置字体样式-->
        <Setter Property="Control.FontFamily" Value="华文行楷"/>
        <Setter Property="Control.FontSize" Value="32"/>
        <Setter Property="Control.Foreground" Value="Black"/>
        <Setter Property="Control.FontWeight" Value="Bold"/>
        <Setter Property="Control.VerticalAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <!--设置一般情况下按钮的形态-->
                        <Border x:Name="background" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}" Opacity="0"
                            Background="{x:Null}" 
                            BorderBrush="{x:Null}"      
                            CornerRadius="2">
                        </Border>
                        <Grid>
                            <ContentPresenter  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <!--当鼠标悬停在按钮上方时,按钮形态设置-->
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Opacity" Value="1" TargetName="background"/>
                            <Setter Property="Foreground" Value="red"/>
                            <Setter Property="Control.FontSize" Value="40"/>
                        </Trigger>
                        <!--当鼠标按下时,按钮形态设置-->
                        <Trigger Property="IsPressed" Value="true">
                            <Setter Property="Background" Value="{x:Null}"/>
                        </Trigger>
                        <!--当按钮不可用时,按钮形态设置-->
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="Gray"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

    有了模板,在定义按钮布局时调用该模板即可,代码如下:

<Grid>
    <Button x:Name="moon" Style="{StaticResource WhiteButton}" Content="当年明月" Margin="98,83,98,0" VerticalAlignment="Top" Height="49"/>
    <Button x:Name="hollow" Style="{StaticResource WhiteButton}" Content="空谷深井" Margin="98,137,98,0" VerticalAlignment="Top" Height="49"/>
    <Button x:Name="flower" IsEnabled="False" Style="{StaticResource WhiteButton}" Content="彼岸花开" Margin="98,191,98,0" VerticalAlignment="Top" Height="49"/>
</Grid>

    则我们可以得到如下图所示的美化过的界面(如果觉得外观还不满意,可以进一步修改模板的视觉部分,其他控件样式的模板基本跟本示例差不多,以后不会再做赘述):

利用按钮模板修改后按钮视觉效果图

    圆角按钮的模板如下:

 <Button x:Name="button" Content="Read Old" HorizontalAlignment="Left" Margin="519,375,0,0" VerticalAlignment="Top" Width="94" Height="34" Background="#FFFFC000" BorderBrush="Black" BorderThickness="1">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="0" CornerRadius="5,5,5,5" Name="PART_Background" Background="#FFFFC000">
                <ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="UIElement.IsMouseOver" Value="True">
                    <Setter Property="Border.Background" TargetName="PART_Background">
                        <Setter.Value>
                            <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                <GradientStop Color="Lime" Offset="0.0" />
                                <GradientStop Color="#66CC33" Offset="0.5" />
                                <GradientStop Color="Gold" Offset="0.0" />
                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>
                <Trigger Property="ButtonBase.IsPressed" Value="True">
                    <Setter Property="UIElement.Effect">
                        <Setter.Value>
                            <DropShadowEffect BlurRadius="10" Color="#FF0033" Direction="0" Opacity="0.6" RenderingBias="Performance" ShadowDepth="0" />
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值