在写自定义控件的时候,有一部分功能是当内部的值发生变化时,需要通知控件的使用者,而当我在写依赖项属性的时候,我可以通过popdp对应的代码模板来完成对应的代码,但是当我来写属性更改回调的时候,却发现没有对应的RoutedEvent,导致需要手撸那么多的代码,而很多时候一旦项目中赶进度,也许就会因为这个原因,把VM下的逻辑放到了UserContorl里了。(我review别人的代码时,发现了好多这种现象,但是逻辑都写完了,改动又太大,而且可能他们一直处于加班状态,我也不好意思在指出这些问题)。所以这一篇是写使用代码模板辅助我们写UserControl时更好的解耦。下一篇博客是讲usercontrol的。里面很多复杂有规律的代码都不是我手撸的,是通过代码模板添加完之后生成的。

如何使用代码模板

在类中定义属性时输入prop对应的单词,然后按下2次Tab键,就可以生成代码片段。

(1)在类中输入prop=》2次Tab创建属性。

(2)生成如下代码:

public int MyProperty { get; set; }

这个内容的定义是在Visual Studio 的工具=》代码片段管理器=》语言我选择CSharp=》My Code Snippets下添加我自己的代码片段。

点击添加=》导入选择我的snippet文件点击导入。如下图

我上传的是一个自动添加路由事件用于属性通知的代码片段。

使用方式如上图在类中输入propurv按下2次Tab键就可以快速的创建代码,模板具体如下,可以快速的修改内容。

 private void OnDefaulRoutedEventChanged(MyProperty oldValue, MyProperty newValue)
      {
           RoutedPropertyChangedEventArgs<MyProperty> args = new RoutedPropertyChangedEventArgs<MyProperty>(oldValue, newValue);
           args.RoutedEvent = ownerclass.DefaulRoutedEventChangedEvent;
           RaiseEvent(args);
      }

       public static readonly RoutedEvent DefaulRoutedEventChangedEvent = EventManager.RegisterRoutedEvent("DefaulRoutedEventChanged", RoutingStrategy.Bubble,
           typeof(RoutedPropertyChangedEventHandler<MyProperty>), typeof(ownerclass));

       public event RoutedPropertyChangedEventHandler<MyProperty> DefaulRoutedEventChanged
      {
           add { AddHandler(DefaulRoutedEventChangedEvent, value); }
           remove { RemoveHandler(DefaulRoutedEventChangedEvent, value); }
      }

这篇的主要目的是为了更好的编写代码。是我在自定义控件代码中解耦VM和UserContorl混用的。

我创建了一个C#相关的交流群。用于分享学习资料和讨论问题,这个propuev也在群文件里。欢迎有兴趣的小伙伴:QQ群:542633085

WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率的更多相关文章

  1. VisualStudio2019 利用代码片段管理器新建快捷命令

    原文:https://www.cnblogs.com/huguodong/p/12694902.html 一.前言 VisualStudio 可以通过敲出缩写字符串,然后按两次Tab按键自动展开成一段 ...

  2. jQuery Mobile高手必备的十大技巧和代码片段

    与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...

  3. iOS开发技巧 -- 复用代码片段

    如果你是一位开发人员在开发过程中会发现有些代码无论是在同一个工程中还是在不同工程中使用率会很高,有经验的人会直接封装在一个类里,或者写成一个宏定义或者把这些代码收集起来,下次直接使用,或者放到xcod ...

  4. YASnippet - emacs 的代码片段管理工具

    添加 snippet M-x 然后输入 yas-new-snippet 回车 RET,会出现一个新的 buffer # -*- mode: snippet -*- # name: # key: # - ...

  5. 超实用的 JavaScript 代码片段( ES6+ 编写)

    Array 数组 Array concatenation (数组拼接) 使用 Array.concat() ,通过在 args 中附加任何数组 和/或 值来拼接一个数组. const ArrayCon ...

  6. VS2015使用技巧 打开代码片段C#部分

    镇场诗: 大梦谁觉,水月中建博客.百千磨难,才知世事无常. 今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1. ...

  7. 精心收集的 95 个超实用的 JavaScript 代码片段( ES6+ 编写)

    https://www.html.cn/archives/8748#table-of-contents https://www.haorooms.com/post/js_regexp

  8. wpf 路由事件 代码片段

    <?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http: ...

  9. Visual Studio使用技巧,创建自己的代码片段

    1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...

随机推荐

  1. Docker系列——Grafana+Prometheus+Node-exporter服务器告警中心(二)

    在前一篇博文中介绍,服务器监控已经部署成功.如果每天都需要人去盯着服务情况,那也不太现实.既然监控平台已经部署好了,是不是可以自动触发报警呢? 在上一篇Prometheus架构中有讲到,核心组件之一: ...

  2. SystemVerilog MCDF比较器

    checker肩负了模拟设计行为和功能检查任务. 功能: 缓存从各个monitor手机到的数据. ton过比较器检查实际收集到的DUT输出端口数据是否同reference module(参考模型)产生 ...

  3. GO语言面向对象05---接口的多态

    package main import "fmt" type Fighter interface { Attack() (bloodloss int) Defend() } /*骑 ...

  4. CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等

    CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等 CVPR 2020中选论文放榜后,最新开源项目合集也来了. 本届CPVR共接收6656篇论文,中选1470篇,&q ...

  5. 编译ONNX模型Compile ONNX Models

    编译ONNX模型Compile ONNX Models 本文是一篇介绍如何使用Relay部署ONNX模型的说明. 首先,必须安装ONNX包. 一个快速的解决方案是安装protobuf编译器,然后 pi ...

  6. 适用于Windows和Linux的Yolo-v3和Yolo-v2(上)

    适用于Windows和Linux的Yolo-v3和Yolo-v2(上) https://github.com/eric-erki/darknetAB (用于对象检测的神经网络)-Tensor Core ...

  7. 浪潮 ClusterEngineV4.0 任意命令执行

    1.浪潮ClusterEngineV4.0 任意命令执行 影响版本 ClusterEngineV4.0 2.漏洞影响 远程代码执行 3.复现 fofa语句 title='TSCEV4.0' 抓包构造e ...

  8. python_selenium_键盘事件

    引言 ----在实际的web测试工作中,需要配合键盘按键来操作,webdriver的  keys()类提供键盘上所有按键的操作,还可以模拟组合键Ctrl+a,Ctrl+v等. 举例: #cording ...

  9. 1、java数据结构和算法---循环队列

    直接上代码: public class CircleArrayQueueLvcai { private int[] array; private int maxSize;//循环队列大小 privat ...

  10. springmvc——CharacterEncodingFilter过滤器要放在所有过滤器前面

    CharacterEncodingFilter的拦截顺序必须是第一个,否则还是会出现乱码问题.这是因为 request对象的parameter并不是一开始就解析的,它是等你第一次调用getParame ...