初学wpf,弄了好久才慢慢弄懂了一点依赖属性,然后现在搞一个自定义控件来进一步了解了解依赖属性。
新建一个wpf项目,在项目中新建一个用户控件,叫MyEllipse。
MyEllipse.xaml代码如下
<UserControl x:Class="WpfApplication20190830A.MyEllipse"
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"
d:DesignHeight="30" d:DesignWidth="30">
<Grid>
<Ellipse Name="myEllipse" Fill="GreenYellow" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>
</UserControl>
控件样子
上面代码中,是把控件设计高度和宽度都改为30,然后放上一个黄绿色的圆,宽高随控件的宽高而变化,命名为myEllipse到时候方便在cs代码中拿到。
然后去MyEllipse.xaml.cs中注册依赖属性,将其封装为CLR属性,还有在依赖属性中的回调函数根据绑定值做逻辑处理。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication20190830A
{
/// <summary>
/// MyEllipse.xaml 的交互逻辑
/// </summary>
public partial class MyEllipse : UserControl
{
public MyEllipse()
{
InitializeComponent();
}
/// <summary>
/// 注册依赖属性MyColorProperty
/// DependencyProperty.Register()参数如下
/// 参数1:MyColor为该依赖属性封装后的CLR属性名
/// 参数2:typeof(int)为其CLR属性的值类型
/// 参数3:typeof(MyEllipse)指定了参数作用的域/界面
/// 参数4:new UIPropertyMetadata(0, changeMyColor),其中0代表默认值,changeMyColor是一个回调函数。
/// </summary>
public static readonly DependencyProperty MyColorProperty =
DependencyProperty.Register("MyColor", typeof(int), typeof(MyEllipse), new UIPropertyMetadata(0, changeMyColor));
/// <summary>
/// 将MyColorProperty封装成CLR属性
/// </summary>
public int MyColor
{
get { return (int)GetValue(MyColorProperty); }
set { SetValue(MyColorProperty, value); }
}
/// <summary>
/// 进行值绑定
/// </summary>
/// <param name="obj">控件对象</param>
/// <param name="r">依赖属性改变值事件参数</param>
private static void changeMyColor(DependencyObject obj, DependencyPropertyChangedEventArgs r)
{
Ellipse ellipse = ((MyEllipse)obj).myEllipse;//拿到圆形控件(默认黄绿色)
//将传入数值和填充颜色进行绑定
switch ((int)r.NewValue)
{
case 1:
ellipse.Fill = new SolidColorBrush(Colors.Black);//填充黑色
break;
case 2:
ellipse.Fill = new SolidColorBrush(Colors.Blue);//填充蓝色
break;
case 3:
ellipse.Fill = new SolidColorBrush(Colors.Brown);//填充棕色
break;
case 4:
ellipse.Fill = new SolidColorBrush(Colors.Red);//填充红色
break;
case 5:
ellipse.Fill = new SolidColorBrush(Colors.Pink);//填充粉色
break;
case 6:
ellipse.Fill = new SolidColorBrush(Colors.Silver);//填充灰色
break;
}
}
}
}
最后是MainWindow.xaml代码
<Window x:Class="WpfApplication20190830A.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfApplication20190830A"
Title="MainWindow" Height="530" Width="300">
<StackPanel>
<my:MyEllipse Width="70" Height="70" Margin="0 10 0 0"></my:MyEllipse>
<my:MyEllipse Width="70" Height="70" MyColor="0"></my:MyEllipse>
<my:MyEllipse Width="60" Height="60" MyColor="1"></my:MyEllipse>
<my:MyEllipse Width="50" Height="50" MyColor="2"></my:MyEllipse>
<my:MyEllipse Width="40" Height="40" MyColor="3"></my:MyEllipse>
<my:MyEllipse Width="50" Height="50" MyColor="4"></my:MyEllipse>
<my:MyEllipse Width="60" Height="60" MyColor="5"></my:MyEllipse>
<my:MyEllipse Width="70" Height="70" MyColor="6"></my:MyEllipse>
</StackPanel>
</Window>
效果如下
从上往下数,第一个圆没有设置MyColor这个属性,所以会自动采用默认值0,第二个圆设置了MyColor=“0”,效果和第一个圆一样。
其他的圆都是传入不同数值,填充了不一样的颜色。
这个自定义控件非常简单,完全适合初学者第一次写自定义控件。