• 将多个现有的控件组合成一个可重用的“组”。
  • 由一个XAML文件和一个后台代码文件。
  • 不能使用样式和模板。
  • 继承自UserControl类。

自定义控件(扩展)

  • 在现有的控件上进行扩展,增加一些新的属性方法等。
  • 包括一个代码文件和一个默认的主题文件。
  • 可以使用样式和模板。
  • 构建控件库的好方法。
=======================================================================

UserControl主要是现有控件的组合。组合是好组合啊,我随便拖几个控件往页面里面一放,比如我弄个TextBox和一个button往页面里面一方,起个名字就是UserControl了,问题是这个UserControl光能看不能用啊。比如说我在WPF窗体里面要对这个UserControl里面的TextBox赋值或者获取它的值,咋获取?我想点击UserControl里的Button来触发这个UserControl所在的WPF窗体后台代码文件里面(暂不提MVVM模式)的某个事件,怎么触发?这两个问题才是创建UserControl的关键问题。

第一个问题:获取或设置属性。

建立一个wpf用户控件项目,在UserControl1.xaml里添加一个Button和TextBox。用户控件默认继承自UserControl类,你也可以修改他的所继承的类。若修改为其他类,UserControl则将拥有这个类的相应的方法和属性。这里先不修改,保持其默认的继承。

现在的主要任务是当这个用户控件放到WPF窗体里面后,在窗体里能获取或设置里面的 TextBox的值。

关键的一步是为这个用户控件添加一个依赖属性。

比如我要给这个用户控件添加一个Text属性,即当我将这个用户控件放到WPF窗口里要获取或者设置它的Text属性。

添加这个Text依赖属性的代码如下:

这样就为这个用户控件

public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string),
typeof(UserControl1),
new PropertyMetadata("TextBox", new PropertyChangedCallback(OnTextChanged)));
public string Text
{
get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); }
} static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs args)
{
UserControl1 source = (UserControl1)sender;
source.tb.Text = (string)args.NewValue;
}

增加了一个名字为Text的属性。若你刚好正在做这方面或者学习这方面的东西,你通过搜索看到了这篇文章估计有人会直接把上面的代码一下看实现了,心里很高兴。这样是很快,但是这是哪走了鱼而不是渔。这里面主要的句代码是

public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string),
typeof(UserControl1),
new PropertyMetadata("TextBox", new PropertyChangedCallback(OnTextChanged)));

然后主要是DependencyProperty.Register方法。

第一个参数,是你要为这个用户控件增加的属性的名字,即你在第一个参数里面填写什么字符串将来你的用户控件将会增加以这个字符串为名字的属性。

第二个参数是指这个属性对应的数据类型。

第三个参数这个属性所有者的类型。

第四个参数属性改变时触发的回调事件。

这个方法及其参数弄懂后,就很容易来为用户控件增加属性了。

下面第二个大问题,事件传阅。

比如我们想让这个用户控件暴露给窗体一个MyButtonClick事件。代码如下

public static readonly RoutedEvent MyButtonClickEvent =
EventManager.RegisterRoutedEvent("MyButtonClick", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<object>), typeof(UserControl1)); public event RoutedPropertyChangedEventHandler<object> MyButtonClick
{
add
{
this.AddHandler(MyButtonClickEvent, value);
} remove
{
this.RemoveHandler(MyButtonClickEvent, value);
}
} public void OnMyButtonClick(object oldValue, object newValue)
{
RoutedPropertyChangedEventArgs<object> arg =
new RoutedPropertyChangedEventArgs<object>(oldValue, newValue, MyButtonClickEvent); this.RaiseEvent(arg);
}

这样通过这两段代码你的用户控件就得到了一个Text属性和一个MyButtonClick方法。

请注意以上两段代码中,特别是第二段注册事件的代码中要特别注意,当你的用户控件继承的基类不同时,注册事件时可能所用的参数和事件的类型会有所不同,比如msdn上有个例子是继承自Button的,其中的事件类型和参数就不同:

public class MyButtonSimple: Button
{
// Create a custom routed event by first registering a RoutedEventID
// This event uses the bubbling routing strategy
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
"Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple)); // Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
add { AddHandler(TapEvent, value); }
remove { RemoveHandler(TapEvent, value); }
} // This method raises the Tap event
void RaiseTapEvent()
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent);
RaiseEvent(newEventArgs);
}
// For demonstration purposes we raise the event when the MyButtonSimple is clicked
protected override void OnClick()
{
RaiseTapEvent();
} }

WPF之路——用户控件对比自定义控件UserControl VS CustomControl)的更多相关文章

  1. WPF中用户控件对比自定义控件(UserControl VS CustomControl)

    接着这篇文章(http://www.cnblogs.com/shiyue/archive/2013/02/02/2889907.html)写: 用户控件(组合) 用于在一个项目中使用多次 自定义控件( ...

  2. WPF 精修篇 用户控件

    原文:WPF 精修篇 用户控件 增加用户控件 数据绑定还是用依赖属性 使用的事件 就委托注册一下 public delegate void ButtonClick(object b,EventArgs ...

  3. 如何在Web.config中注册用户控件和自定义控件

    问题: 在ASP.NET 的早先版本里,开发人员通过在页面的顶部添加 指令来引入和使用自定义服务器控件和用户控件时,象这样: <%@ Register TagPrefix="scott ...

  4. Asp.net 用户控件和自定义控件注册

    在ASPX页中注册用户控件的方法 <%@ Register Src="ListPicker.ascx" TagName="ListPicker"  Tag ...

  5. c# 中的UserControl是什么 用户控件和自定义控件有什么区别

    用户控件是许多控件的集成 自定义控件是自己写一个控件类,或者继承已有的控件类 复合控件是封装在公共容器内的 Windows 窗体控件的集合.这种控件有时称为“用户控件”.包含的控件称为“构成控件”. ...

  6. WPF学习- AllowDrop 用户控件启用拖放功能

    知识点: 创建自定义用户控件(UserControl) 使用户控件成为拖动源 使用户控件成为放置目标 使面板能够接收从用户控件放置的数据 创建项目: 1.新建WPF项目(Wpf-AllowDrop) ...

  7. WPF窗口和用户控件事件相互触发

    问题1: WPF项目里有一个窗口和一个用户控件,窗口和用户控件里都有一个Button,点击窗口里的Button如何触发用户控件里Button的Click事件 解答: //窗口代码 public par ...

  8. [WPF 学习] 3.用户控件库使用资源字典的困惑

    项目需要(或者前后端分离的需要),前端我使用了用户控件库,由后端用代码加载和控制. 然而用户控件库没法指定资源字典,于是在用户控件的xaml文件里面手工添加了资源字典 <UserControl. ...

  9. WPF获取当前用户控件的父级窗体

    方式一.通过当前控件名获取父级窗体 Window targetWindow = Window.GetWindow(button); 方式二.通过当前控件获取父级窗体 Window parentWind ...

随机推荐

  1. flex 布局示例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Spring IOC、对象依赖关系

    Spring IOC.对象依赖关系   2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...

  3. python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...

  4. Random.org -- 真正的随机数生成器

    接触过程序设计的人一定对随机数不陌生.随机数的用途非常广,比方在測试.分布和统计程序.游戏中. 大多数编程语言也提供了随机数库.能够方便的使用. 只是从严格意义上来讲,这些程序生成的随机数并非真正的随 ...

  5. SSI整合 示例

    sql语句 create table user_c (id varchar(10) primary key,name varchar(20),age int ,address varchar(30); ...

  6. scott权限

    有时scott数据被破坏了  可以回复 以下为 安装路径 dos下   @G:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott. ...

  7. Openresty配置文件上传下载

    1. 下载包安装Openresty openresty-1.13.6.1下载地址 https://openresty.org/download/openresty-1.13.6.1.tar.gz 安装 ...

  8. FPGA大公司面试笔试数电部分,看看你会多少

    1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...

  9. 利用inotifywait监控主机文件和目录

    利用inotifywait监控主机文件和目录 inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ...

  10. JVM-String常量池与运行时常量池

    Start with JVM 周志明先生著-<深入理解Java虚拟机>,书买回来好几天了,但是最近才准备开始搞一搞了(哭瞎…..).首先是第一章的Java以及JVM发展历史,大概知道了现行 ...