首先我们要知道用户控件与自定义用户控件的确保
用户控件
1将多个现有的控件组合成一个可重用的“组”。
2不能使用样式和模板。
3继承自UserControl类。
自定义控件
1在现有的控件上进行扩展,增加一些新的属性方法等。
2包括一个代码文件和一个默认的主题文件。
3可以使用样式和模板。
4构建控件库的好方法。
说白了一个就是把现有自带的控件进行一定的封装变成一个新的控件另一个是 修改稿原有的底层代码使得他具备了一些新的功效
现在 我们在以一个textbox 为例 我们想要文本框为空时显示水印,水印的内容可以自由改变,这个时候我们想到了用户控件 右键 新增 用户控件
在TextboxUserControl里添加TextBox。用户控件默认继承自UserControl类,现在的主要任务是当这个用户控件放到WPF窗体里面后,在窗体里能获取或设置里面的TextBox的值。
关键的一步是为这个用户控件添加一个依赖属性。
比如我要给这个用户控件添加一个Text属性,即当我将这个用户控件放到WPF窗口里要获取或者设置它的Text属性。
public string Text
{
get { return (string)GetValue(TextProperty); }
Set { SetValue(TextProperty, value);}
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));
然后主要是DependencyProperty.Register方法。
第一个参数,是你要为这个用户控件增加的属性的名字,即你在第一个参数里面填写什么字符串将来你的用户控件将会增加以这个字符串为名字的属性。
第二个参数是指这个属性对应的数据类型。
第三个参数这个属性所有者的类型。
第四个参数属性改变时触发的回调事件。
好了 用户控件第一步已经建立好了,我们在客户端也能够绑定好访问Text属性,但是 我们想要的水印还没有出现
首先我们要定义好一个水印的视觉刷 视觉刷的效果时根据客户端输入的水印来显示到视觉刷上面 放入TextBox.Resources里面 然后我们TextBox 添加一个样式当Text属性为空的时候设置Background 背景色为我们刚刚定义好的视觉刷
那么达这里我们的第二步就达成了 写好了相应的样式 我们会发现我们还缺失一个属性
那么我们重复第一不操作 添加一个水印的依赖属性WaterMarkText
到现在我们拥有水印的用户控件就基本完成了,以下时当前用户控件的全部代码
前端界面代码
<UserControl x:Class="Resources.UserControls.TextboxUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" x:Name="control"
d:DesignHeight="100" d:DesignWidth="300">
<DockPanel>
<TextBox DockPanel.Dock="Top" Padding="1.5" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ToolTip="{Binding WaterMarkText,ElementName=control}" Width="{Binding ActualWidth,ElementName=control}" Height="{Binding ActualHeight,ElementName=control}" Name="txtFilter" Text="{Binding Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, ElementName=control}" >
<TextBox.Resources>
<VisualBrush x:Key="HelpBrush" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock Width="{Binding ActualWidth,ElementName=control}" VerticalAlignment="Center" FontStyle="Italic" FontSize="12" Text="{Binding WaterMarkText,ElementName=control}"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Resources>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource HelpBrush}"/>
</Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource HelpBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</DockPanel>
</UserControl>
后台代码
using System.Windows;
using System.Windows.Controls;
namespace Resources.UserControls
{
/// <summary>
/// TextboxUserControl.xaml 的交互逻辑
/// </summary>
public partial class TextboxUserControl : UserControl
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set
{
SetValue(TextProperty, value);
}
}
// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));
/// <summary>
/// 添加附件依赖属性
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
//propdp 快捷方式
public string WaterMarkText
{
get { return (string)GetValue(WaterMarkTextProperty); }
set { SetValue(WaterMarkTextProperty, value); }
}
// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty WaterMarkTextProperty =
DependencyProperty.Register("WaterMarkText", typeof(string), typeof(TextboxUserControl), new PropertyMetadata(""));
public TextboxUserControl()
{
InitializeComponent();
//if (DesignerProperties.GetIsInDesignMode(this)) return;
}
}
}
由于用户控件和样式我们在前面定义了资源字典 应用程序添加资源字典
在XAML页面进行调用我们封装好的控件的资源字典
我们就已经完成了一个完整的用户控件的制作了