十三. 依赖属性监听
如果想监听依赖属性的改变,可以用两种方法实现,在很多时候,我们两种方法都会用到:
用DependencyPropertyDescriptor 比较简便,在代码里面写起来也比较便捷;
用OverrideMetadata的方式主要在自定义控件以及处理一些类间关系的时候;
第一种方法:派生自这个类,然后定义它的属性,重写属性的原数据并传递一个PropertyChangedCallBack参数即可,如下代码:
public class MyTextBox : TextBox
{ public MyTextBox(): base() { } static MyTextBox() { //第一种方法,通过OverrideMetadata
FlowDirectionProperty.OverrideMetadata(typeof(MyTextBox),new FrameworkPropertyMetadata(new PropertyChangedCallback(FlowDirectionPropertyChanged))); } private static void FlowDirectionPropertyChanged(DependencyObject sender,DependencyPropertyChangedEventArgs args) { ((MyTextBox)sender).FontWeight = (((MyTextBox)sender).FlowDirection == FlowDirection.LeftToRight) ? FontWeights.Bold : FontWeights.Normal; } }
第二种方法:这个方法更加简单,获取DependencyPropertyDescriptor并调用AddValueChange()为其挂接一个回调函数,如下代码:
private void Window1_Loaded(object sender,175);">RoutedEventArgs e) { //第二种方法,通过OverrideMetadata
DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty,typeof(TextBox)); descriptor.AddValueChanged(tbxEditMe,tbxEditMe_TextChanged); } private void tbxEditMe_TextChanged(object sender,175);">EventArgs e) { MessageBox.Show("","Changed"); }
十四. 代码段(自动生成)
代码段可以说是一个非常普遍且实用的功能,我们可以利用它来简化和规范我们的代码。在项目当中我们通常会定义大量的代码段,如怎样写一个类、怎样定义一个方法、公用代码库等等都可以定义成代码段,今天不着重讲这一块,下面就来看看在默认的VS中有哪些代码段
上面看到的是visual basic的代码段(一不小心截图截错了,呵呵),但不幸的是针对C#的代码段却很少。不过没关系,既然默认没有提供那么多代码段,我们可以自己动手嘛, 正所谓自己动手丰衣足食嘛!相信大家都有自定义代码段的经历,同时在网上也有很多好的代码段下载,我用得最多的是DrWPFSnippets,由于接触 WPF和Silverlight是在07年,所以当时自己也定义过一些代码段,由于自己主要精力还是在技术架构、ASP.NET、WCF、OO等方面,所 以在08年以后就开始使用网上的代码段资源了,当然由于之前项目也自己写了一些代码段,所以很多时候都是混合起来使用,大家可以到http://drwpf.com/blog/2010/04/30/updated-code-snippets/去 下载,这个代码段包最早从2007年11月就提供下载了,在今年四月份进行了升级,同时支持VS2005/VS2008/VS2010,所以大家可以下载 下来体验一下,很不错的哦!下载以后点击DrWPFSnippets.vsi就会自动安装,安装完成以后,你会看到如下界面,图中的Shortcut就是 你要按的快捷键,不过生成的代码会出现有些帮助类找不到的情况,如RoutedEvent会生成一个RoutedEventHelper的类,这个是没有 关系的,你到网上一搜就可以把这个类加入到你的代码当中。那么运行就十分正常了。在安装的时候提醒一下,最好一次安装成功,否则你会为众多的弹窗口感到十 分厌恶,呵呵!
那么现在你就可以在项目当中使用了,如按下re+TAB键两次,你就会看到如下界面,然后选择你的选项即可生成需要的代码(这里re就是Routed event的简写)。
#region Swindle /// <summary>
/// Swindle Routed Event
/// </summary>
public static readonly RoutedEvent SwindleEvent = EventManager.RegisterRoutedEvent("Swindle",175);">RoutingStrategy.Bubble,typeof(TrioEventHandler),175);">Window1)); /// <summary>
/// Occurs when ...
/// </summary>
public event TrioEventHandler Swindle { add { AddHandler(SwindleEvent,value); } remove { RemoveHandler(SwindleEvent,value); } } /// <summary>
/// A helper method to raise the Swindle event.
/// </summary>
/// <param name="arg"> </param>
/// <param name="arg2"> </param>
/// <param name="arg3"> </param>
protected TrioEventArgs RaiseSwindleEvent(bool arg,bool arg2,bool arg3) { return RaiseSwindleEvent(this,arg,arg2,arg3); } /// <summary>
/// A static helper method to raise the Swindle event on a target element.
/// </summary>
/// <param name="target">UIElement or ContentElement on which to raise the event</param>
/// <param name="arg"> </param>
/// <param name="arg2"> </param>
/// <param name="arg3"> </param>
internal static TrioEventArgs RaiseSwindleEvent(DependencyObject target,bool arg,bool arg3) { if (target == null) return null; TrioEventArgs args = new TrioEventArgs(arg,arg3); args.RoutedEvent = SwindleEvent; RoutedEventHelper.RaiseEvent(target,args); return args; } #endregion