WPF 使用依赖属性自定义控件
使用依赖属性自定义控件,依赖属性必须定义在自定义控件中,不能定义在其他文件中
一、先实现一个类继承你要复写的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media; namespace Demo2.Controls
{
public class UserNameBox : TextBox
{ #region 用户名图标
public string Icon
{
get { return (string)GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
} // Using a DependencyProperty as the backing store for Icon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("Icon", typeof(string), typeof(UserNameBox));
#endregion #region 获取焦点时,用户名图标 public string Focused_Icon
{
get { return (string)GetValue(Focused_IconProperty); }
set { SetValue(Focused_IconProperty, value); }
} // Using a DependencyProperty as the backing store for Focused_Icon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty Focused_IconProperty =
DependencyProperty.Register("Focused_Icon", typeof(string), typeof(UserNameBox)); #endregion #region 水印内容 public string WaterMark
{
get { return (string)GetValue(WaterMarkProperty); }
set { SetValue(WaterMarkProperty, value); }
} // Using a DependencyProperty as the backing store for WaterMark. This enables animation, styling, binding, etc...
public static readonly DependencyProperty WaterMarkProperty =
DependencyProperty.Register("WaterMark", typeof(string), typeof(UserNameBox)); #endregion #region 圆角大小 public double CornerRadius
{
get { return (double)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
} // Using a DependencyProperty as the backing store for CornerRadius. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof(double), typeof(UserNameBox)); #endregion #region 删除按钮 public ImageBrush DeleteIcon
{
get { return (ImageBrush)GetValue(DeleteIconProperty); }
set { SetValue(DeleteIconProperty, value); }
} // Using a DependencyProperty as the backing store for DeleteIcon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DeleteIconProperty =
DependencyProperty.Register("DeleteIcon", typeof(ImageBrush), typeof(UserNameBox)); #endregion #region 是否显示密码框 public bool IsVisiblityPassword
{
get { return (bool)GetValue(IsVisiblityPasswordProperty); }
set { SetValue(IsVisiblityPasswordProperty, value); }
} // Using a DependencyProperty as the backing store for IsVisiblityPassword. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsVisiblityPasswordProperty =
DependencyProperty.Register("IsVisiblityPassword", typeof(bool), typeof(UserNameBox)); #endregion }
}
在里面定义的依赖属性就为你自定义控件的属性,可以在布局文件中使用它们来进行设定值
可以在布局中设定值,然后在style中进行引用
<Window x:Class="Demo2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:Demo2.Controls"
xmlns:s="clr-namespace:System;assembly=mscorlib"
Background="Black"
WindowStartupLocation="CenterScreen"
Title="Demo2" Height="300" Width="300"> <Window.Resources>
<s:String x:Key="Username_Unclick">/Demo2;component/Resources/Icons/username_unclick.png</s:String>
<s:String x:Key="Username_Onclick">/Demo2;component/Resources/Icons/username_onclick.png</s:String>
<s:String x:Key="Password_Unclick">/Demo2;component/Resources/Icons/password_unclick.png</s:String>
<s:String x:Key="Password_Onclick">/Demo2;component/Resources/Icons/password_onclick.png</s:String> <ImageBrush x:Key="Delete_Icon" ImageSource="/Demo2;component/Resources/Icons/delete.png" />
</Window.Resources> <StackPanel>
<!--用户名-->
<c:UserNameBox Width="230"
Height="38"
Margin="0,20,0,0"
FontSize="18"
Text="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
VerticalContentAlignment="Center"
WaterMark="用户名"
CornerRadius="5"
DeleteIcon="{StaticResource Delete_Icon}"
Icon="{StaticResource Username_Unclick}"
IsVisiblityPassword="False"
Focused_Icon="{StaticResource Username_Onclick}"/> <!--密码-->
<c:UserNameBox x:Name="password"
Width="230"
Height="38"
Margin="0,20,0,0"
FontSize="18"
Text="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
VerticalContentAlignment="Center"
WaterMark="密码"
CornerRadius="5"
IsVisiblityPassword="True"
DeleteIcon="{StaticResource Delete_Icon}"
Icon="{StaticResource Password_Unclick}"
Focused_Icon="{StaticResource Password_Onclick}"/> </StackPanel>
</Window>
在style中进行引用
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:c="clr-namespace:Demo2.Controls"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style TargetType="{x:Type c:UserNameBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type c:UserNameBox}">
<Border Background="White"
BorderThickness="0"
CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CornerRadius}">
<Grid>
<!--分为3列-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition/>
<ColumnDefinition Width="40"/>
</Grid.ColumnDefinitions> <!--图标-->
<Image Grid.Column="0"
Margin="5,0,5,0"
x:Name="usernameIcon"
Source="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Icon}" /> <!--文本和水印-->
<ScrollViewer Grid.Column="1"
x:Name="PART_ContentHost"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Focusable="True"/>
<TextBlock x:Name="waterMark"
Grid.Column="1"
VerticalAlignment="Center"
Foreground="Silver"
FontSize="18"
Padding="5,0,0,0" /> <!--删除按钮-->
<c:DeleteButton x:Name="deleteTextButton"
Grid.Column="2"
Width="15"
Height="15"
Style="{DynamicResource ButtonStyle2}"
ButtonBG="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DeleteIcon}"
Margin="0,5,10,5"
Visibility="Visible"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Focusable="False"
Command="{Binding CleanUserNameCommand}"/>
</Grid>
</Border> <ControlTemplate.Triggers>
<!--当获取焦点时-->
<Trigger Property="IsFocused" Value="true">
<Setter Property="Source" TargetName="usernameIcon" Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Focused_Icon}" />
</Trigger> <!--当文本为空时-->
<Trigger Property="Text" Value="">
<Setter Property="Text" TargetName="waterMark" Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=WaterMark}" />
<Setter Property="Visibility" TargetName="deleteTextButton" Value="Collapsed" />
</Trigger> <!--当属性为true时,显示密码框(将文本显示格式更改位密码显示样式)-->
<Trigger Property="IsVisiblityPassword" Value="true">
<Setter Property="Command" TargetName="deleteTextButton" Value="{Binding CleanPasswordCommand}" />
<Setter Property="Height" Value="30"/>
<Setter Property="Foreground" Value="Transparent"></Setter>
<Setter Property="FontSize" Value="20"></Setter>
<Setter Property="FontFamily" Value="Courier New"></Setter>
<Setter Property="TextDecorations">
<Setter.Value>
<TextDecorationCollection>
<TextDecoration>
<TextDecoration.Pen>
<Pen Thickness="10"
Brush="Black"
EndLineCap="Round"
StartLineCap="Round"
DashCap="Round" >
<Pen.DashStyle>
<DashStyle Dashes="0.0,1.2" Offset="0.6"/>
</Pen.DashStyle>
</Pen>
</TextDecoration.Pen>
<TextDecoration.Location>
<TextDecorationLocation>Strikethrough</TextDecorationLocation>
</TextDecoration.Location>
</TextDecoration>
</TextDecorationCollection>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
WPF 使用依赖属性自定义控件的更多相关文章
- WPF的依赖属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...
- wpf 的依赖属性只能在loaded 事件之后才能取到
wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 ...
- WPF 中依赖属性的继承(Inherits)
WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- WPF的依赖属性和附加属性(用法解释较全)
转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...
- WPF利用依赖属性和命令编写自定义控件
以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlD ...
- WPF: 只读依赖属性的介绍与实践
在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性" ...
- WPF 之 依赖属性与附加属性(五)
一.CLR 属性 程序的本质是"数据+算法",或者说用算法来处理数据以期得到输出结果.在程序中,数据表现为各种各样的变量,算法则表现为各种各样的函数(操作符是函数的简记法). ...
- WPF 自定义依赖属性
原博客地址:http://www.cnblogs.com/DebugLZQ/archive/2012/11/30/2796021.html DependencyObject和Dependen ...
随机推荐
- Android-FileUtils工具类
文件相关工具类 public final class FileUtils { private FileUtils() { throw new UnsupportedOperationException ...
- 【JAVA 学习笔记1】代码注释
在JAVA中支持单行注释和多行注释 1.单行注释,只要在注释的一行代码中加上双斜杠即可 例如: // int a=2,b=4,c=8; 2.多行注释,在开始位置加上/* 结束位置加上*/ 例如 /* ...
- linux 进程通信之 管道和FIFO
进程间通信:IPC概念 IPC:Interprocess Communication,通过内核提供的缓冲区进行数据交换的机制. IPC通信的方式: pipe:管道(最简单) fifo:有名管道 mma ...
- Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用
最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...
- django系列3.2--url的别名和反向解析 reverse
命名URL和反向解析 在网页中某些要提交的地址等,需要改变的时候,此时网页过多,如果一个一个的去改,工作量巨大,这时就可以用到命名url,在html文件的模版中,只写命名,这样当需要我们改变urls. ...
- Python3.5 学习一
初期学习,离不了环境搭建及语言的基本语法等. Python属于动态解析.跨平台. 前期了解了Pyhon环境搭建,在Linux(ubuntu)和windows上都有所学习了解,由于不再当前所学资料教程内 ...
- “全栈2019”Java异常第十九章:RuntimeException详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- tushare模块的应用
一.简介以及环境安装 TuShare是一个著名的免费.开源的python财经数据接口包.其官网主页为:TuShare -财经数据接口包.该接口包如今提供了大量的金融数据,涵盖了股票.基本面.宏观.新闻 ...
- django入门-自定义管理界面-part7
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6522854.html 完全翻译自官方文档 https://docs.djangoproje ...
- linux互传文件nc命令
使用nc命令可以很快的在两台主机传递文件,且不需要在同一网段,只要设置好端口即可. 一.安装(CentOS下) yum install -y nc (需要root权限,可以用加上sudo) 二.使用 ...