WPF入门教程系列十四——依赖属性(四)
2021-05-12 04:28
标签:reading cli 改变 element metadata 例子 threading mode ide 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 那么应该如何使用这些功能呢? 前面我们讲了基本的流程,下面我们就用一个小的例子来进行说明: XAML的代码如下: C#的代码如下: 结果如下: 当ValidDP属性变化之后,PropertyChangeCallback就会被调用。可以看到结果并没有完全按照我们先前的流程先 Coerce后Validate的顺序执行,有可能是WPF内部做了什么特殊处理,当属性被修改时,首先会调用Validate来判断传入的value是 否有效,如果无效就不继续后续的操作,这样可以更好的优化性能。从上面的结果上看出,CoerceValue后面并没有立即ValidateValue, 而是直接调用了PropertyChanged。这是因为前面已经验证过了value,如果在Coerce中没有改变value,那么就不用再验证了。如 果在 Coerce中改变了value,那么这里还会再次调用ValidateValue操作,和前面的流程图执行的顺序一样,在最后我们会调用 ValidateValue来进行最后的验证,这就保证最后的结果是我们希望的那样了。 上面简单介绍了处理流程,下面我们就以一个案例来具体看一看上面的流程到底有没有出入。 依赖属性代码文件如下: XAML代码如下: C#代码如下: 示例效果如下图。 在上面的例子中,一共有三个依赖属性相互作用——CurrentValue、MinValue和MaxValue,这些属性相互作 用,但它们的规则是MinValue≤CurrentValue≤MaxValue。根据这个规则,当其中一个依赖属性变化时,另外两个依赖 属性必须进行适当的调整,这里我们要用到的就是CoerceValue这个回调委托,那么实现起来也非常的简单,注册MaxValue的时候加入 CoerceValueCallback,在CoerceMaxValue函数中做处理:如果Maximum的值小于MinValue,则使 MaxValue值等于MinValue;同理在CurrentValue中也加入了CoerceValueCallback进行相应的强制 处理。然后在MinValue的ChangedValueCallback被调用的时候,调用CurrentValue和MaxValue的 CoerceValue回调委托,这样就可以达到相互作用的依赖属性一变应万变的”千机变“。 换句话说,当相互作用的几个依赖属性其中一个发生变化时,在它的PropertyChangeCallback中调用受它影响的依赖属性的CoerceValue,这样才能保证相互作用关系的正确性。 前面也提高ValidateValue主要是验证该数据的有效性,最设置了值以后都会调用它来进行验证,如果验证不成功,则抛出异常。 WPF入门教程系列十四——依赖属性(四) 标签:reading cli 改变 element metadata 例子 threading mode ide 原文地址:http://www.cnblogs.com/zzw1986/p/7583531.html六、依赖属性回调、验证及强制值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
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.Shapes;
using System.Windows.Threading;
using WpfApp1.Models;
namespace WpfApp1
{
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp1.Controls
{
class MyValiDP:System.Windows.Controls.Control
{
//注册Current依赖属性,并添加PropertyChanged、CoerceValue、ValidateValue的回调委托
public static readonly DependencyProperty CurrentValueProperty = DependencyProperty.Register(
"CurrentValue",
typeof(double),
typeof(MyValiDP),
new FrameworkPropertyMetadata(
Double.NaN,
FrameworkPropertyMetadataOptions.None,
new PropertyChangedCallback(OnCurrentValueChanged),
new CoerceValueCallback(CoerceCurrentValue)
),
new ValidateValueCallback(IsValidValue)
);
//属性包装器,通过它来暴露Current的值
public double CurrentValue
{
get { return (double)GetValue(CurrentValueProperty); }
set { SetValue(CurrentValueProperty, value); }
}
//注册Min依赖属性,并添加PropertyChanged、CoerceValue、ValidateValue的回调委托
public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register(
"MinValue",
typeof(double),
typeof(MyValiDP),
new FrameworkPropertyMetadata(
double.NaN,
FrameworkPropertyMetadataOptions.None,
new PropertyChangedCallback(OnMinValueChanged),
new CoerceValueCallback(CoerceMinValue)
),
new ValidateValueCallback(IsValidValue));
//属性包装器,通过它来暴露Min的值
public double MinValue
{
get { return (double)GetValue(MinValueProperty); }
set { SetValue(MinValueProperty, value); }
}
//注册Max依赖属性,并添加PropertyChanged、CoerceValue、ValidateValue的回调委托
public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register(
"MaxValue",
typeof(double),
typeof(MyValiDP),
new FrameworkPropertyMetadata(
double.NaN,
FrameworkPropertyMetadataOptions.None,
new PropertyChangedCallback(OnMaxValueChanged),
new CoerceValueCallback(CoerceMaxValue)
),
new ValidateValueCallback(IsValidValue)
);
//属性包装器,通过它来暴露Max的值
public double MaxValue
{
get { return (double)GetValue(MaxValueProperty); }
set { SetValue(MaxValueProperty, value); }
}
//在CoerceCurrent加入强制判断赋值
private static object CoerceCurrentValue(DependencyObject d, object value)
{
MyValiDP g = (MyValiDP)d;
double current = (double)value;
if (current g.MaxValue) current = g.MaxValue;
return current;
}
//当Current值改变的时候,调用Min和Max的CoerceValue回调委托
private static void OnCurrentValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(MinValueProperty);
d.CoerceValue(MaxValueProperty);
}
//当OnMin值改变的时候,调用Current和Max的CoerceValue回调委托
private static void OnMinValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(MaxValueProperty);
d.CoerceValue(CurrentValueProperty);
}
//在CoerceMin加入强制判断赋值
private static object CoerceMinValue(DependencyObject d, object value)
{
MyValiDP g = (MyValiDP)d;
double min = (double)value;
if (min > g.MaxValue) min = g.MaxValue;
return min;
}
//在CoerceMax加入强制判断赋值
private static object CoerceMaxValue(DependencyObject d, object value)
{
MyValiDP g = (MyValiDP)d;
double max = (double)value;
if (max
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.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace WpfApp1
{
///
文章标题:WPF入门教程系列十四——依赖属性(四)
文章链接:http://soscw.com/index.php/essay/84535.html