C# WPF 自定义按钮的方法

 更新时间:2021年03月03日 11:31:41   作者:louzi  
这篇文章主要介绍了C# WPF 自定义按钮的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

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

实现效果

  1. 使用图片做按钮背景;
  2. 自定义鼠标进入时效果;
  3. 自定义按压效果;
  4. 自定义禁用效果

实现效果如下图所示:

实现步骤

  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>

以上就是C# WPF 自定义按钮的方法的详细内容,更多关于C# WPF 自定义按钮的资料请关注脚本之家其它相关文章!

相关文章

  • c# Rank属性与GetUpperBound方法的深入分析

    c# Rank属性与GetUpperBound方法的深入分析

    本篇文章是对c#中的Rank属性与GetUpperBound方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#串口通信工具类的封装

    C#串口通信工具类的封装

    这篇文章主要为大家详细介绍了C#串口通信工具类封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 详解C#如何计算一个实例占用多少内存

    详解C#如何计算一个实例占用多少内存

    我们都知道CPU和内存是程序最为重要的两类指标,那么有多少人真正想过一个类型的实例在内存中究竟占多少字节,本文就来用C#计算一下一个实例占用多少内存吧
    2023-06-06
  • 学习Winform分组类控件(Panel、groupBox、TabControl)

    学习Winform分组类控件(Panel、groupBox、TabControl)

    这篇文章主要和大家一起学习Winform分组类控件,包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • C#队列的简单使用

    C#队列的简单使用

    队列的特性很简答,就是先进先出,一般利用数组来实现,本文就介绍了C#队列的简单使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 3种方法实现WindowsForm切换窗口

    3种方法实现WindowsForm切换窗口

    这篇文章主要介绍了3种方法实现WindowsForm切换窗口,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Task提高异步执行效率技巧

    Task提高异步执行效率技巧

    这篇文章介绍了Task提高异步执行效率的技巧,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#线程处理系列之线程池中的I/O线程

    C#线程处理系列之线程池中的I/O线程

    这篇文章主要介绍了C#线程处理系列之线程池中的I/O线程,在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • datatable生成excel和excel插入图片示例详解

    datatable生成excel和excel插入图片示例详解

    excel导出在C#代码中应用己经很广泛了,下面讲了datatable生成excel、复制sheet页、删除sheet页、选中sheet页、另存excel文件、excel中插入图片等功能
    2014-01-01
  • C#异常处理详解

    C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下
    2013-10-10

最新评论