附加属性也是一种特殊的依赖属性。

Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性。

更加.NET类属性的写法经验。这个中可以直接点出来的,都是不用实例化的静态的。以Top属性为例:

public static readonly DependencyProperty TopProperty =
DependencyProperty.RegisterAttached("Top",
typeof(double), typeof(Canvas),
new FrameworkPropertyMetadata(0d,
FrameworkPropertyMetadataOptions.Inherits)); public static void SetTop(UIElement element, double value)
{
element.SetValue(TopProperty, value);
} public static double GetTop(UIElement element)
{
return (double)element.GetValue(TopProperty);
}

看如下代码效果:

<Canvas Background="#AAAAAA" Height="150" Width="200">
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="50" Height="50" Fill="Red" />
</Canvas>

代码中可以看到, Convas.Left附加属性实际作用在 Rectangle在Canvas中的Left属性上,Convas.Top附加属性实际作用在 Rectangle在Canvas中的Top属性上。

再来看一个例子:

<Grid>
<Grid.Clip>
<EllipseGeometry Center="400 200" RadiusX="160" RadiusY="200" />
</Grid.Clip>
<Image Source="ping.jpg" Stretch="Fill" />
</Grid>

通过Grid的附加属性Clip我们截取到了想要的图片效果。

那么什么时候去使用附加属性呢?下面是WPF经典Material Design主题开源项目Material Design In XAML Toolkit中对于阴影部分处理的源码。

public static class ShadowAssist
{
public static readonly DependencyProperty ShadowDepthProperty = DependencyProperty.RegisterAttached(
"ShadowDepth", typeof (ShadowDepth), typeof (ShadowAssist), new FrameworkPropertyMetadata(default(ShadowDepth), FrameworkPropertyMetadataOptions.AffectsRender)); public static void SetShadowDepth(DependencyObject element, ShadowDepth value)
{
element.SetValue(ShadowDepthProperty, value);
} public static ShadowDepth GetShadowDepth(DependencyObject element)
{
return (ShadowDepth) element.GetValue(ShadowDepthProperty);
} private static readonly DependencyPropertyKey LocalInfoPropertyKey = DependencyProperty.RegisterAttachedReadOnly(
"LocalInfo", typeof (ShadowLocalInfo), typeof (ShadowAssist), new PropertyMetadata(default(ShadowLocalInfo))); private static void SetLocalInfo(DependencyObject element, ShadowLocalInfo value)
{
element.SetValue(LocalInfoPropertyKey, value);
} private static ShadowLocalInfo GetLocalInfo(DependencyObject element)
{
return (ShadowLocalInfo) element.GetValue(LocalInfoPropertyKey.DependencyProperty);
} public static readonly DependencyProperty DarkenProperty = DependencyProperty.RegisterAttached(
"Darken", typeof (bool), typeof (ShadowAssist), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.AffectsRender, DarkenPropertyChangedCallback)); private static void DarkenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var uiElement = dependencyObject as UIElement;
var dropShadowEffect = uiElement?.Effect as DropShadowEffect; if (dropShadowEffect == null) return; if ((bool) dependencyPropertyChangedEventArgs.NewValue)
{
SetLocalInfo(dependencyObject, new ShadowLocalInfo(dropShadowEffect.Opacity)); var doubleAnimation = new DoubleAnimation(, new Duration(TimeSpan.FromMilliseconds()))
{
FillBehavior = FillBehavior.HoldEnd
};
dropShadowEffect.BeginAnimation(DropShadowEffect.OpacityProperty, doubleAnimation);
}
else
{
var shadowLocalInfo = GetLocalInfo(dependencyObject);
if (shadowLocalInfo == null) return; var doubleAnimation = new DoubleAnimation(shadowLocalInfo.StandardOpacity, new Duration(TimeSpan.FromMilliseconds()))
{
FillBehavior = FillBehavior.HoldEnd
};
dropShadowEffect.BeginAnimation(DropShadowEffect.OpacityProperty, doubleAnimation);
}
} public static void SetDarken(DependencyObject element, bool value)
{
element.SetValue(DarkenProperty, value);
} public static bool GetDarken(DependencyObject element)
{
return (bool) element.GetValue(DarkenProperty);
} public static readonly DependencyProperty CacheModeProperty = DependencyProperty.RegisterAttached(
"CacheMode", typeof(CacheMode), typeof(ShadowAssist), new FrameworkPropertyMetadata(new BitmapCache { EnableClearType = true, SnapsToDevicePixels = true }, FrameworkPropertyMetadataOptions.Inherits)); public static void SetCacheMode(DependencyObject element, CacheMode value)
{
element.SetValue(CacheModeProperty, value);
} public static CacheMode GetCacheMode(DependencyObject element)
{
return (CacheMode)element.GetValue(CacheModeProperty);
} public static readonly DependencyProperty ShadowEdgesProperty = DependencyProperty.RegisterAttached(
"ShadowEdges", typeof(ShadowEdges), typeof(ShadowAssist), new PropertyMetadata(ShadowEdges.All)); public static void SetShadowEdges(DependencyObject element, ShadowEdges value)
{
element.SetValue(ShadowEdgesProperty, value);
} public static ShadowEdges GetShadowEdges(DependencyObject element)
{
return (ShadowEdges) element.GetValue(ShadowEdgesProperty);
}
}
<Setter Property="wpf:ShadowAssist.ShadowDepth" Value="Depth1" />

谷歌提出的“材料设计” 理念中,阴影是比较重要的一部分,而该项目就是使用了附加属性来达到了效果。其中还有不少特性也是通过附加属性来完成的,给我如何使用附加属性,提供了比较好的模板。

可以参考学习:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit

最新文章

  1. ASP.NET MVC 学习笔记(一)
  2. java 枚举的常见使用方法
  3. APK动态加载框架(DL)解析
  4. Activiti 流程实例、任务、执行对象及相关的表
  5. [CareerCup] 3.3 Set of Stacks 多个栈
  6. ioinc
  7. cocos2d-x中false,setSwallowTouches,stopPropagation的区别
  8. Hibernate 关联 set 和 list 对比
  9. [Oracle] - 性能优化工具(5) - AWRSQL
  10. 开发环境下jboss 7.1.1 Final 的jsp热部署解决方案--转
  11. 前端菜鸟学习之DOM事件处理
  12. linux操作系统基础篇(三)
  13. php 下载保存文件保存到本地的两种实现方法
  14. Linux下不同文件不同颜色的意义
  15. Luogu P1245 电话号码
  16. no module named win32api
  17. js、jquery实现放大镜效果
  18. Laravel5使用QQ邮箱发送邮件配置
  19. maven 如何引入本地jar包
  20. py4CV例子3Mnist识别和ANN

热门文章

  1. Python3.6 字典的内置方法
  2. C# 获取汉字的拼音首字母和全拼(含源码)
  3. JAVA基础--JAVA API集合框架(其他集合类,集合原理)15
  4. WindowsService服务程序开发 安装和卸载
  5. 【Unity3D】3D角色换装++ Advance
  6. 3DMAX 烘培技术
  7. 51nod1416(dfs)
  8. 利用多项式实现图像几何校正(Matlab实现)
  9. Vue.js实战
  10. 快速对接payjs的个人支付接口(收银台模式)