首页 > 其他分享 >wpf自定义控件库(二)——伪3D按钮

wpf自定义控件库(二)——伪3D按钮

时间:2023-03-16 17:46:50浏览次数:48  
标签:控件 DependencyProperty 自定义 MyButton Brush wpf public typeof

1、以学习wpf为目的,同时也为了增加控件代码的复用性,开始建立自己的自定义控件库;

2、目前主要是根据项目需求去增加,完善控件库。希望之后能一步步扩展更多更丰富的控件;

3、目前新增的控件主要是继承自基础控件,再做一些额外的扩展。

 

先上效果图:

 

 原理比较简单,在Button原来的Border下面还有一个Border,它负责在点击的时候,做一个平移变换,从右下角转到左上角。

直接上代码:

<Style TargetType="c:MyButton" BasedOn="{StaticResource {x:Type Button}}">
        <Setter Property="Background" Value="#FFC0C0C0"/>
        <Setter Property="BorderBrush" Value="#FF808080"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="c:MyButton">
                    <Grid>
                        <Border Name="rect" Background="#8000" Opacity="1" CornerRadius="{TemplateBinding BorderCornerRadius}">
                            <Border.RenderTransform>
                                <TranslateTransform X="2" Y="2"/>
                            </Border.RenderTransform>
                        </Border>
                        <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true" CornerRadius="{TemplateBinding BorderCornerRadius}">
                            <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                <ContentPresenter.RenderTransform>
                                    <TranslateTransform X="2" Y="2"/>
                                </ContentPresenter.RenderTransform>
                            </ContentPresenter>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsDefaulted" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="border" Property="RenderTransform">
                                <Setter.Value>
                                    <TranslateTransform X="1" Y="1"/>
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="rect" Property="RenderTransform">
                                <Setter.Value>
                                    <TranslateTransform X="0" Y="0"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Opacity" Value="0.8" TargetName="border"/>
                            <Setter Property="Opacity" Value="0.5" TargetName="rect"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

一些需要注意的点:

1、样式是直接继承Button的;

BasedOn="{StaticResource {x:Type Button}}"

2、作为阴影部分的Border,需写在原Border上方,防止遮挡。同时它的background:#8000是一个半透明的颜色,感觉挺有用的;

3、也可以用DropShadowEffect这个东西作为阴影;

 

 

后台代码:MyButton类(主要就是开发一些依赖属性方便实际使用时编辑,这里面的5个依赖属性其实只用到了1个,那就是圆角,剩下4个主要是用在了MyButton的另一个Style--2D普通样式)

using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;

namespace ControlsLibrary.Controls
{
    public class MyButton : Button
    {
        static MyButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyButton), new FrameworkPropertyMetadata(typeof(MyButton)));
        }
        /// <summary>
        /// 鼠标在控件上时-背景色
        /// </summary>
        public Brush MouseOverBackground
        {
            get { return (Brush)GetValue(MouseOverBackgroundProperty); }
            set
            {
                SetValue(MouseOverBackgroundProperty, value);
            }
        }
        public static readonly DependencyProperty MouseOverBackgroundProperty =
            DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(MyButton));
        /// <summary>
        /// 鼠标在控件上时-边框颜色
        /// </summary>
        public Brush MouseOverBorderBrush
        {
            get { return (Brush)GetValue(MouseOverBorderBrushProperty); }
            set { SetValue(MouseOverBorderBrushProperty, value); }
        }
        public static readonly DependencyProperty MouseOverBorderBrushProperty =
            DependencyProperty.Register("MouseOverBorderBrush", typeof(Brush), typeof(MyButton));
        /// <summary>
        /// 鼠标按下时-背景色
        /// </summary>
        public Brush MousePressBackground
        {
            get { return (Brush)GetValue(MousePressBackgroundProperty); }
            set { SetValue(MousePressBackgroundProperty, value); }
        }
        public static readonly DependencyProperty MousePressBackgroundProperty =
            DependencyProperty.Register("MousePressBackground", typeof(Brush), typeof(MyButton));
        /// <summary>
        /// 鼠标按下时-边框颜色
        /// </summary>
        public Brush MousePressBorderBrush
        {
            get { return (Brush)GetValue(MousePressBorderBrushProperty); }
            set { SetValue(MousePressBorderBrushProperty, value); }
        }
        public static readonly DependencyProperty MousePressBorderBrushProperty =
            DependencyProperty.Register("MousePressBorderBrush", typeof(Brush), typeof(MyButton));


        /// <summary>
        /// Button圆度
        /// </summary>
        public CornerRadius BorderCornerRadius
        {
            get { return (CornerRadius)GetValue(BorderCornerRadiusProperty); }
            set { SetValue(BorderCornerRadiusProperty, value); }
        }
        public static readonly DependencyProperty BorderCornerRadiusProperty =
            DependencyProperty.Register("BorderCornerRadius", typeof(CornerRadius), typeof(MyButton), new PropertyMetadata(new CornerRadius(5)));


    }
}

 

标签:控件,DependencyProperty,自定义,MyButton,Brush,wpf,public,typeof
From: https://www.cnblogs.com/JustWantToStudy/p/17223556.html

相关文章

  • pageOffice控件实现在线编辑Word 只能加批注的功能
    OA办公中,业务需要编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作怎么实现编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作呢?#1、......
  • wpf 自定义控件库(一)
    1、以学习wpf为目的,同时也为了增加控件代码的复用性,开始建立自己的自定义控件库;2、目前主要是根据项目需求去增加,完善控件库。希望之后能一步步扩展更多更丰富的控件;3、......
  • 如何隐藏、恢复和删除 Tkinter 控件
    在本文中,我们将介绍如何通过单击按钮来隐藏,恢复Tkinter控件。最后,我们还将向你展示如何删除或杀死现有的Tkinter控件。隐藏和恢复Tkinter控件pack_forget()隐藏T......
  • LiveChart for wpf
    1.引用LiveChart.Wpf的类库xmlns:lvc:="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"以直方图、折线图为例,都属于CartesianChart下的一种Series类型,例如折......
  • QT5笔记: 22. 自定义代理
    代理作用:在界面发生编辑时可以指定编辑所用的组件,可以沟通Model和View自定义代理需要继承的基类和需要实现的方法使用步骤:继承QStyledItemDelegate,实现上面的四个......
  • C语言编程>第五周 ③ 编写一个程序,用于求m的n次幂。m 和n 由用户输入, 调用自定义的求m
    例题:编写一个程序,用于求m的n次幂。m和n由用户输入,调用自定义的求m的n次幂的函数,并输出计算结果。​​代码如下:​​#include<stdio.h>intpower(intm,intn);intm,n,a=......
  • 自定义TCP协议,私有TCP协议以及TCP协议安全性提高升级
    tcp协议是最底层的,一般来说无需修改,直接使用。但是在某些场景下,直接使用会带来一些安全性的问题:比如物联网设备。物联网设备需要经常的发送消息到服务器,如果直接使用标准T......
  • Raize控件的RzBorder报错的问题
    分析结果:这里发现一个问题,就是elements(这个数字)和后面的那个数字必须对应,这个是以为编码问题,造成系统识别的长度不一样。因此解决最简单的办法:直接修改字符长度一样就可......
  • WPF Progress 样式
    一、前言滚动条一般用于加载进度,我们在看视频的时候或者在浏览网页的时候经常能看到加载进度的页面。在程序开发中,默认的进度加载样式可能跟程序风格不太一样,或者加载进度......
  • WPF MenuItem 样式
    一、前言默认的MenuItem样式比较普通,这次自定义MenuItem的样式也只是对MenuItem的颜色风格进行变化。需要其他功能的变化,大家可以根据样式代码进行扩展。MenuItem的样式......