wpf 自定义按钮

一  代码结构
       如图所示,采用自定义控件(CustomControl)的方式对Button控件进行封装。其中ImageButton.xaml为默认控件模板,ImageButton.cs为控件的逻辑控制文件,其中包含了ImageButton控件所需要的新的依赖属性,包括图片源属性等。

二 模板代码

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControl">

<Style TargetType="{x:Type local:ImageButton}">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ImageButton}">

<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="grid" Background="{TemplateBinding Background}">
<Border x:Name="PART_Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="{TemplateBinding CornerRadius}"/>

<Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
<StackPanel HorizontalAlignment="Center" Orientation="{TemplateBinding IconContentOrientation}" VerticalAlignment="Center" Margin="{TemplateBinding Padding}">
<Grid HorizontalAlignment="Center" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<Image x:Name="PART_Icon" Source="{TemplateBinding Icon}" Height="{TemplateBinding IconHeight}" Width="{TemplateBinding IconWidth}"/>
<Image x:Name="PART_MouseOverIcon" Visibility="Collapsed" Source="{TemplateBinding IconMouseOver}" Height="{TemplateBinding IconHeight}" Width="{TemplateBinding IconWidth}"/>
<Image x:Name="PART_PressIcon" Visibility="Collapsed" Source="{TemplateBinding IconPress}" Height="{TemplateBinding IconHeight}" Width="{TemplateBinding IconWidth}"/>
</Grid>
<TextBlock x:Name="PART_Content" Text="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Margin="{TemplateBinding IconContentMargin}"
Foreground="{TemplateBinding Foreground}"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
</Grid>
</Grid>
</Border>

<ControlTemplate.Triggers>

<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" TargetName="PART_Content" Value="{Binding MouseOverForeground,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="Background" TargetName="PART_Border" Value="{Binding MouseOverBackground,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="BorderBrush" TargetName="PART_Border" Value="{Binding MouseOverBorderBrush,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="Visibility" TargetName="PART_MouseOverIcon" Value="Visible"/>
<Setter Property="Visibility" TargetName="PART_Icon" Value="Collapsed"/>
<Setter Property="Visibility" TargetName="PART_PressIcon" Value="Collapsed"/>
</Trigger>

<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" TargetName="PART_Content" Value="{Binding MouseDownForeground,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="Background" TargetName="PART_Border" Value="{Binding MouseDownBackground,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="BorderBrush" TargetName="PART_Border" Value="{Binding MouseDownBorderBrush,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ImageButton}}}"/>
<Setter Property="Visibility" TargetName="PART_PressIcon" Value="Visible"/>
<Setter Property="Visibility" TargetName="PART_Icon" Value="Collapsed"/>
<Setter Property="Visibility" TargetName="PART_MouseOverIcon" Value="Collapsed"/>
</Trigger>

<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.5" />
</Trigger>

<Trigger Property="Text" SourceName="PART_Content" Value="">
<Setter Property="Visibility" TargetName="PART_Content" Value="Collapsed"/>
</Trigger>

<Trigger Property="Text" SourceName="PART_Content" Value="{x:Null}">
<Setter Property="Visibility" TargetName="PART_Content" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

在模板中,通过TemplateBinding 的方式绑定了控件中的自定义属性,并默认显示给定的图标和文字。
然后通过触发器,当鼠标悬停或按下的时候,控制相关图标的显示隐藏以及文字的背景色、前景色和边框颜色。

三 自定义依赖属性
       在ImageButton.cs中定义依赖属性,这些依赖属性包含了图片按钮控件的边框、前景色、背景色,图片等属性。在复写的OnApplyTemplate方法中,会判断如果某些依赖属性的值为null,则使用默认属性。

public class ImageButton : Button
{
static ImageButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton)));
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (this.MouseOverBackground == null)
{
this.MouseOverBackground = Background;
}
if (this.MouseDownBackground == null)
{
if (this.MouseOverBackground == null)
{
this.MouseDownBackground = Background;
}
else
{
this.MouseDownBackground = MouseOverBackground;
}
}
if (this.MouseOverBorderBrush == null)
{
this.MouseOverBorderBrush = BorderBrush;
}
if (this.MouseDownBorderBrush == null)
{
if (this.MouseOverBorderBrush == null)
{
this.MouseDownBorderBrush = BorderBrush;
}
else
{
this.MouseDownBorderBrush = MouseOverBorderBrush;
}
}
if (this.MouseOverForeground == null)
{
this.MouseOverForeground = Foreground;
}
if (this.MouseDownForeground == null)
{
if (this.MouseOverForeground == null)
{
this.MouseDownForeground = Foreground;
}
else
{
this.MouseDownForeground = this.MouseOverForeground;
}
}
}

#region Dependency Properties

/// <summary>
/// 鼠标移上去的背景颜色
/// </summary>
public static readonly DependencyProperty MouseOverBackgroundProperty
= DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(ImageButton));

/// <summary>
/// 鼠标按下去的背景颜色
/// </summary>
public static readonly DependencyProperty MouseDownBackgroundProperty
= DependencyProperty.Register("MouseDownBackground", typeof(Brush), typeof(ImageButton));

/// <summary>
/// 鼠标移上去的字体颜色
/// </summary>
public static readonly DependencyProperty MouseOverForegroundProperty
= DependencyProperty.Register("MouseOverForeground", typeof(Brush), typeof(ImageButton), new PropertyMetadata(null, null));

/// <summary>
/// 鼠标按下去的字体颜色
/// </summary>
public static readonly DependencyProperty MouseDownForegroundProperty
= DependencyProperty.Register("MouseDownForeground", typeof(Brush), typeof(ImageButton), new PropertyMetadata(null, null));

/// <summary>
/// 鼠标移上去的边框颜色
/// </summary>
public static readonly DependencyProperty MouseOverBorderBrushProperty
= DependencyProperty.Register("MouseOverBorderBrush", typeof(Brush), typeof(ImageButton), new PropertyMetadata(null, null));

/// <summary>
/// 鼠标按下去的边框颜色
/// </summary>
public static readonly DependencyProperty MouseDownBorderBrushProperty
= DependencyProperty.Register("MouseDownBorderBrush", typeof(Brush), typeof(ImageButton), new PropertyMetadata(null, null));

/// <summary>
/// 圆角
/// </summary>
public static readonly DependencyProperty CornerRadiusProperty
= DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ImageButton), null);

//图标
public static readonly DependencyProperty IconProperty
= DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ImageButton), null);

//鼠标移上去的图标图标
public static readonly DependencyProperty IconMouseOverProperty
= DependencyProperty.Register("IconMouseOver", typeof(ImageSource), typeof(ImageButton), null);

//鼠标按下去的图标图标
public static readonly DependencyProperty IconPressProperty
= DependencyProperty.Register("IconPress", typeof(ImageSource), typeof(ImageButton), null);

//图标高度
public static readonly DependencyProperty IconHeightProperty
= DependencyProperty.Register("IconHeight", typeof(double), typeof(ImageButton), new PropertyMetadata(24.0, null));

//图标宽度
public static readonly DependencyProperty IconWidthProperty
= DependencyProperty.Register("IconWidth", typeof(double), typeof(ImageButton), new PropertyMetadata(24.0, null));

//图标和内容的对齐方式
public static readonly DependencyProperty IconContentOrientationProperty
= DependencyProperty.Register("IconContentOrientation", typeof(Orientation), typeof(ImageButton), new PropertyMetadata(Orientation.Horizontal, null));

//图标和内容的距离
public static readonly DependencyProperty IconContentMarginProperty
= DependencyProperty.Register("IconContentMargin", typeof(Thickness), typeof(ImageButton), new PropertyMetadata(new Thickness(0, 0, 0, 0), null));

#endregion

#region Property Wrappers

public Brush MouseOverBackground
{
get
{
return (Brush)GetValue(MouseOverBackgroundProperty);
}
set { SetValue(MouseOverBackgroundProperty, value); }
}

public Brush MouseDownBackground
{
get
{
return (Brush)GetValue(MouseDownBackgroundProperty);
}
set { SetValue(MouseDownBackgroundProperty, value); }
}

public Brush MouseOverForeground
{
get
{
return (Brush)GetValue(MouseOverForegroundProperty);
}
set { SetValue(MouseOverForegroundProperty, value); }
}

public Brush MouseDownForeground
{
get
{
return (Brush)GetValue(MouseDownForegroundProperty);
}
set { SetValue(MouseDownForegroundProperty, value); }
}

public Brush MouseOverBorderBrush
{
get { return (Brush)GetValue(MouseOverBorderBrushProperty); }
set { SetValue(MouseOverBorderBrushProperty, value); }
}

public Brush MouseDownBorderBrush
{
get { return (Brush)GetValue(MouseDownBorderBrushProperty); }
set { SetValue(MouseDownBorderBrushProperty, value); }
}

public CornerRadius CornerRadius
{
get { return (CornerRadius)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}

public ImageSource Icon
{
get { return (ImageSource)GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
}

public ImageSource IconMouseOver
{
get { return (ImageSource)GetValue(IconMouseOverProperty); }
set { SetValue(IconMouseOverProperty, value); }
}

public ImageSource IconPress
{
get { return (ImageSource)GetValue(IconPressProperty); }
set { SetValue(IconPressProperty, value); }
}

public double IconHeight
{
get { return (double)GetValue(IconHeightProperty); }
set { SetValue(IconHeightProperty, value); }
}

public double IconWidth
{
get { return (double)GetValue(IconWidthProperty); }
set { SetValue(IconWidthProperty, value); }
}

public Orientation IconContentOrientation
{
get { return (Orientation)GetValue(IconContentOrientationProperty); }
set { SetValue(IconContentOrientationProperty, value); }
}

public Thickness IconContentMargin
{
get { return (Thickness)GetValue(IconContentMarginProperty); }
set { SetValue(IconContentMarginProperty, value); }
}

#endregion
}

四 控件的应用
       应用控件的时候,只需要简单的绑定控件的相关属性即可。

<control:ImageButton x:Name="btn_Image"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Red"
Margin="5,0,5,0" ToolTip="播放" Content="播放"
Height="30" Width="80"
Icon="Images\BroadcastWhite.png"
IconMouseOver="Images\BroadcastGray.png"
IconPress="Images\BroadcastBlue.png"
IconHeight="24"
IconWidth="24"
FontSize="16"
IconContentMargin="10,0,0,0"
Foreground="#FFFFFF"
MouseOverForeground="Gray"
MouseDownForeground="Blue"/>

原文地址:https://www.cnblogs.com/sword1983/p/12208865.html

时间: 2024-08-30 14:17:02

wpf 自定义按钮的相关文章

WPF学习笔记-用Expression Blend制作自定义按钮

1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点击此按钮,选择Edit control parts(template)>Edit a copy... 3.在弹出的Create style resource对话框中,修改新按钮样式的名称 4.在左侧的Object and timeline面板中选中ContentPresenter元素,按Ctrl+X将此标记临时保存到内存中 5.选中Chrome,按Delete键删除 6.选中Template,在

[01]可拖动、可调节大小、自定义按钮风格的无边框WPF程序

初学WPF,用VS2012写了一个可拖动.可调节大小.自定义按钮风格的无边框程序.效果如下: 实现过程:一.拖动.调节大小.无边框主要参考了: http://blog.csdn.net/dlangu0393/article/details/12548731 二.自己主要完成自定义按钮效果. 1.  WPF定义按钮风格方法 (1) 添加一个Resource Dictionary文件,如Style.xaml.例如: <ResourceDictionary xmlns="http://schem

在VS2005中设置WPF中自定义按钮的事件

原文:在VS2005中设置WPF中自定义按钮的事件 上篇讲了如何在Blend中绘制圆角矩形(http://blog.csdn.net/johnsuna/archive/2007/08/13/1740781.aspx),本篇继续下一步骤,如何自定义按钮的事件. (1)首先,在VS2005中打开上篇所建的项目(File - Open Project),找到LinearGradientButton.csproj(这是我这里的项目名称),打开之后,双击LinearGradientDemo.xaml.cs

WPF 自定义图片按钮

原文:WPF 自定义图片按钮 此文档仅仅是一个BaseCode,已做后续查阅 XAML代码: <Button x:Class="IM.UI.UC.IM_ImageButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc=&qu

WPF自定义样式篇-DataGrid

WPF自定义样式篇-DataGrid 先上效果图: 样式: <!--DataGrid样式-->    <Style TargetType="DataGrid">        <Setter Property="RowHeaderWidth" Value="0"></Setter>        <Setter Property="AutoGenerateColumns"

WPF自定义路由事件

一 概要 本文通过实例演示WPF自定义路由事件的使用,进而探讨了路由事件与普通的CLR事件的区别(注:"普通的CLR事件"这个说法可能不太专业,但是,我暂时也找不到什么更好的称呼,就这么着吧,呵呵.)(扩展阅读:例说.NET事件的使用). 二 实例演示与说明 1 新建DetailReportEventArgs类,该类派生自RoutedEventArgs类,RoutedEventArgs类包含与路由事件相关的状态信息和事件数据.DetailReportEventArgs类中定义了属性Ev

写自己的WPF样式 - 按钮

做一个后台管理小程序,据说WPF的界面比较"炫",于是选择使用WPF来开发.既然用了WPF当然需要做好看点了,于是稍微研究了下WPF的样式,废话不多说下面开始自定义一个按钮样式: (1)在App.xaml文件里自定义一个按钮样式 ,"MyWpfButton": <Application x:Class="WPFCustomerStyleStudy.App" xmlns="http://schemas.microsoft.com/w

WPF 自定义滚动条样式

先看一下效果: 先分析一下滚动条有哪儿几部分组成: 滚动条总共有五部分组成: 两端的箭头按钮,实际类型为RepeatButton Thumb 两端的空白,实际也是RepeatButton 最后就是Thumb(滑块) 所以如果要修改滚动条的样式,就要修改这五部分的样式.具体代码如下: <!--自定义滚动条样式-->            <SolidColorBrush x:Key="StandardBorderBrush"                       

IOS 自定义按钮(代码实现)+九宫格

在一些下载应用里整个页面都是按钮,有好多好多,但是仔细观察不难发现他们很有规律.就像下面一样?? 很有规律的排列在屏幕上,那么这需要我们怎么去做能. 正如标题,我们需要了解两个知识点,分别是自定义按钮和九宫格,九宫格是一种算法.在这里我给大家列出方法,并不过多解释,希望会对大家有帮助. 代码如下: 自定义按钮部分 // // CXButton.m // CX-自定义按钮(代码实现)+九宫格 // // Created by ma c on 16/3/18. // Copyright ? 2016