C# WPF 自定义按钮的方法

作者:louzi 时间:2021-08-30 23:42:11 

本文介绍WPF一种自定义按钮的方法。

实现效果

  1. 使用图片做按钮背景;

  2. 自定义鼠标进入时效果;

  3. 自定义按压效果;

  4. 自定义禁用效果

实现效果如下图所示:

C# WPF 自定义按钮的方法

实现步骤

  1. 创建CustomButton.cs,继承自Button;

  2. 创建一个资源文件ButtonStyles.xaml;

  3. 在资源文件中设计按钮的Style;

  4. 在CustomButton.cs中添加Style中需要的依赖属性;

  5. 在程序中添加资源并引用(为了方便在不同的程序中引用自定义按钮,自定义按钮放在独立的类库中,应用程序中进行资源合并即可)。

示例代码


// ButtonStyles.xaml
<Style x:Key="CustomButton" TargetType="{x:Type local:CustomButton}">
 <Setter Property="Template">
   <Setter.Value>
     <ControlTemplate TargetType="{x:Type local:CustomButton}">
       <Grid x:Name="container">
         <Image Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
             Source="{Binding ButtonImage,RelativeSource={RelativeSource Mode=TemplatedParent}}">
           <Image.RenderTransformOrigin>
             <Point X="0.5" Y="0.5"/>
           </Image.RenderTransformOrigin>
           <Image.RenderTransform>
             <ScaleTransform x:Name="scaletrans" ScaleX="1" ScaleY="1"/>
           </Image.RenderTransform>
         </Image>
       </Grid>
       <ControlTemplate.Triggers>
         <Trigger Property="IsEnabled" Value="False">
           <Setter Property="Opacity" Value="0.5" TargetName="container"/>
         </Trigger>
         <Trigger Property="IsMouseOver" Value="True">
           <Setter Property="Background" Value="#2c000000" TargetName="container"/>
         </Trigger>
         <Trigger Property="IsPressed" Value="True">
           <Trigger.EnterActions>
             <BeginStoryboard>
               <Storyboard>
                 <DoubleAnimation Storyboard.TargetName="scaletrans" Storyboard.TargetProperty="(ScaleTransform.ScaleX)"
                 To="0.8" Duration="0:0:0.15" AutoReverse="True"/>
                 <DoubleAnimation Storyboard.TargetName="scaletrans" Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
                 To="0.8" Duration="0:0:0.15" AutoReverse="True"/>
               </Storyboard>
             </BeginStoryboard>
           </Trigger.EnterActions>
         </Trigger>
       </ControlTemplate.Triggers>
     </ControlTemplate>
   </Setter.Value>
 </Setter>
</Style>

// CustomButton.cs
public class CustomButton : Button
{
 public ImageSource ButtonImage
 {
   get { return (ImageSource)GetValue(ButtonImageProperty); }
   set { SetValue(ButtonImageProperty, value); }
 }

public static readonly DependencyProperty ButtonImageProperty =
   DependencyProperty.Register("ButtonImage", typeof(ImageSource), typeof(CustomButton),
   new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
}

// App.xaml 合并资源
<Application.Resources>
 <ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source=".../ButtonStyles.xaml"/>
   </ResourceDictionary.MergedDictionaries>
 </ResourceDictionary>  
</Application.Resources>

// view.xaml 使用
<Grid>
 <customcontrols:CustomButton Width="48" Height="48"
   Style="{StaticResource CustomButton}" ButtonImage="/Louzi.Paint;component/Images/Toolbar/write.png"/>
</Grid>

来源:https://www.cnblogs.com/louzixl/p/14454750.html

标签:c#,wpf,自定义,按钮
0
投稿

猜你喜欢

  • C#调用WebService实例开发

    2022-11-21 22:51:08
  • Android获取点击屏幕的位置坐标

    2023-12-14 21:18:31
  • 深入理解C#序列化与反序列化的详解

    2022-06-23 05:11:58
  • WindowsForm实现警告消息框的实例代码

    2023-05-25 00:00:54
  • Java+element实现excel的导入和导出

    2022-07-31 12:45:53
  • C#检查指定对象是否存在于ArrayList集合中的方法

    2023-07-28 00:45:17
  • Java实现指定线程执行顺序的三种方式示例

    2021-08-16 15:11:34
  • springboot中的静态资源加载顺序优先级

    2023-08-24 11:12:31
  • Android完整Socket解决方案

    2023-12-22 14:42:40
  • springmvc的文件保存方法详解

    2023-06-12 00:33:43
  • Map集合之HashMap的使用及说明

    2022-07-23 15:56:56
  • 浅谈单例模式和线程安全问题

    2023-11-25 06:27:34
  • Springboot引用外部配置文件的方法步骤

    2022-06-14 13:29:35
  • JavaWeb工程中集成YMP框架快速上手

    2023-11-24 12:15:12
  • 浅谈SpringBoot @Autowired的两种注入方式

    2021-06-28 06:08:34
  • C#引用类型转换的常见方式总结

    2022-03-02 16:53:58
  • Java毕业设计实战之健身器材商城系统的实现

    2022-12-18 01:39:56
  • 如何在C# 中查找或结束程序域中的主、子进程

    2023-06-14 20:00:41
  • Struts2相关的面试题整理分享

    2022-04-06 08:02:20
  • Java泛型中<?>和<T>的区别浅析

    2023-11-25 05:20:09
  • asp之家 软件编程 m.aspxhome.com