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 ...
随机推荐
- Oracle EBS Model Function Technical
♡.Oracle EBS(ERP)Oracle 是公司名字,这个我估计大家都知道.EBS是E-Business Suite的缩写,简单的说,就是Oracle做的一个企业级的信息化软件或者系统,里面包含 ...
- ASP.NET Core2调用Azure云上的PowerBI报表展示
在开发企业应用中,报表功能是当之无愧的重头戏,如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题.而找到一款合适的报表往往都需要考率价格.开发.风格.支撑等因素.那么,我在这里给大家介绍一 ...
- C#基础入门 七
C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...
- task3:词频统计
相关的类: java.util.regex.Pattern static Pattern compile(String regex) //编译模式 static Pattern compile(Str ...
- C#注册表操作类(完整版) 整理完整
/// <summary> /// 注册表基项静态域 /// /// 主要包括: /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 /// ...
- UWP开发入门(七)——下拉刷新
本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难.UWP开发更大的困难在于懒惰,缺乏学习的意愿.而不是“某软连下拉刷新控件都没有”这样的想法. 之 ...
- UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command
上一篇我们提到如何让“讲述人”读出自定义的CanReadGrid,但“讲述人”仍然无法识别CanReadGrid上绑定的Command.XAML代码如下: <StackPanel> < ...
- Web Api 内部数据思考 和 利用http缓存优化 Api
在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一 实际使用应该返回怎样的数据 ? ...
- 循环语句(循环for与while等)
1.1for循环 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 在linux云服务器上运行Jar文件
在linux服务器上运行Jar文件时通常的方法是: $ java -jar test.jar 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务,有没有办法让Jar在后台 ...