原文:WPF 精修篇 自定义控件

自定义控件 因为没有办法对界面可视化编辑 所以用来很少

现在实现的是 自定义控件的 自定义属性 和自定义方法

用VS 创建自定义控件后 会自动创建 Themes 文件夹和 Generic.xaml 还有自定义的类 这边是SeachControl

Gneneric


  1. <Style TargetType="{x:Type local:SeachControl}">
  2. <Setter Property="Template">
  3. <Setter.Value>
  4. <ControlTemplate TargetType="{x:Type local:SeachControl}">
  5. <Grid>
  6. <StackPanel Orientation="Horizontal" >
  7. <TextBox Width="100" Height="20" Margin="0,0,5,0" Text="{Binding SearchText, RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}" Background="{TemplateBinding Background}"></TextBox>
  8. <Button x:Name="button" Content="Select" Width="50" Height="20" ></Button>
  9. </StackPanel>
  10. </Grid>
  11. </ControlTemplate>
  12. </Setter.Value>
  13. </Setter>
  14. </Style>

自定义控件类


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. namespace WpfApplication24
  15. {
  16. /// <summary>
  17. /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。
  18. ///
  19. /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。
  20. /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
  21. /// 元素中:
  22. ///
  23. /// xmlns:MyNamespace="clr-namespace:WpfApplication24"
  24. ///
  25. ///
  26. /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。
  27. /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
  28. /// 元素中:
  29. ///
  30. /// xmlns:MyNamespace="clr-namespace:WpfApplication24;assembly=WpfApplication24"
  31. ///
  32. /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用,
  33. /// 并重新生成以避免编译错误:
  34. ///
  35. /// 在解决方案资源管理器中右击目标项目,然后依次单击
  36. /// “添加引用”->“项目”->[浏览查找并选择此项目]
  37. ///
  38. ///
  39. /// 步骤 2)
  40. /// 继续操作并在 XAML 文件中使用控件。
  41. ///
  42. /// <MyNamespace:SeachControl/>
  43. ///
  44. /// </summary>
  45. public class SeachControl : Control
  46. {
  47. static SeachControl()
  48. {
  49. DefaultStyleKeyProperty.OverrideMetadata(typeof(SeachControl), new FrameworkPropertyMetadata(typeof(SeachControl)));
  50. }
  51. public string SearchText
  52. {
  53. get { return (string)GetValue(SearchTextProperty); }
  54. set { SetValue(SearchTextProperty, value); }
  55. }
  56. // Using a DependencyProperty as the backing store for SearchText. This enables animation, styling, binding, etc...
  57. public static readonly DependencyProperty SearchTextProperty =
  58. DependencyProperty.Register("SearchText", typeof(string), typeof(SeachControl), new PropertyMetadata(""));
  59. public delegate void OnSeachClick(object ob, SearchEventArgs args);
  60. public event OnSeachClick SeachButtenClick;
  61. public override void OnApplyTemplate()
  62. {
  63. base.OnApplyTemplate();
  64. var button = GetTemplateChild("button");
  65. if (button is Button)
  66. {
  67. (button as Button).Click += SeachControl_Click;
  68. }
  69. }
  70. void SeachControl_Click(object sender, RoutedEventArgs e)
  71. {
  72. if (SeachButtenClick != null)
  73. {
  74. SeachButtenClick.Invoke(this, new SearchEventArgs() { SreachItem = SearchText });
  75. }
  76. }
  77. }
  78. }

创建参数类


  1. public class SearchEventArgs:EventArgs
  2. {
  3. public string SreachItem { get; set; }
  4. }

main 引用 这里可以看到自定义的事件


  1. <Window x:Class="WpfApplication24.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:MyNamespace="clr-namespace:WpfApplication24"
  5. Title="MainWindow" Height="350" Width="525">
  6. <Window.Resources>
  7. </Window.Resources>
  8. <Grid>
  9. <MyNamespace:SeachControl HorizontalAlignment="Center" SearchText="嗯嗯" VerticalAlignment="Center" Background="#FFCBCBCB" SeachButtenClick="SeachControl_SeachButtenClick" />
  10. </Grid>
  11. </Window>

Main的内容类


  1. private void SeachControl_SeachButtenClick(object ob, SearchEventArgs args)
  2. {
  3. MessageBox.Show("HI "+ args.SreachItem);
  4. }

WPF 精修篇 自定义控件的更多相关文章

  1. WPF 精修篇 数据触发器

    原文:WPF 精修篇 数据触发器 数据触发器 可以使用Binding 来绑定控件 或者数据源 来触发相关动作 举栗子 <Window.Resources> <Style Target ...

  2. WPF 精修篇 属性触发器

    原文:WPF 精修篇 属性触发器 属性触发器是通过  某个条件触发改变属性 通过无代码实现功能 <Style TargetType="{x:Type Label}"> ...

  3. WPF 精修篇 样式继承

    原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...

  4. WPF 精修篇 用户控件

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

  5. WPF 精修篇 DataGrid 筛选

    原文:WPF 精修篇 DataGrid 筛选 DataGrid也可以分组 但是用的地方不多 就没写 筛选还是可以的 比如Datagrid数据量比较大 要做数据筛选 贴码 <DataGrid x: ...

  6. WPF 精修篇 DataGrid 数据源排序

    原文:WPF 精修篇 DataGrid 数据源排序 效果 <DataGrid x:Name="datagrid" ItemsSource="{Binding Ele ...

  7. WPF 精修篇 数据绑定到对象

    原文:WPF 精修篇 数据绑定到对象 数据绑定到对象 首先 我们需要一个对象 public class Preson { private string name; public string Name ...

  8. WPF 精修篇 数据绑定 更新通知

    原文:WPF 精修篇 数据绑定 更新通知 开始更新一点有意思的了 首先 数据绑定  其中之一 Element 绑定 看例子 <Window x:Class="WpfApplicatio ...

  9. WPF 精修篇 依赖属性

    原文:WPF 精修篇 依赖属性 依赖属性使用场景 1. 希望可在样式中设置属性. 2. 希望属性支持数据绑定. 3. 希望可使用动态资源引用设置属性. 4. 希望从元素树中的父元素自动继承属性值. 5 ...

随机推荐

  1. border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题

    box-sizing box-sizing的CSS属性是用来改变默认的CSS框模型 属性 初始值:content-box 适用于:接受的所有元素的宽度或高度 继承:无 媒体:visual 指定的:as ...

  2. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  3. 团队项目之Scrum7

    小组:BLACK PANDA 时间:2019.11.27 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 内容展示 根据三大板块进行分类: 电影. 音乐以及摄影 今天计划完成 ...

  4. Mac环境安装非APP STORE中下载的软件,运行报错:“XXX” is damaged and can’t be opened. You should move it to the Trash. 解决办法

    出现这个错误的大多数原因都是因为系统设置的问题,因为系统不信任你从其他地方下载的软件安装包,所以运行时就给你阻止了.具体的设置步骤如下: 1. 打开系统偏好设置 (System Preferences ...

  5. SQL语句性能调整原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  6. JavaScript-----13.内置对象 Math()和Date()

    1. 内置对象 js对象分为3种:自定义对象(var obj={}).内置对象.浏览器对象. 前两种对象是js基础内容,属于ECMAScript,第三个浏览器对象是js独有的.讲js API的时候会讲 ...

  7. docker-19.03安装部署,阿里源加速

    docker所依赖的包环境,为了方便不报错,推荐执行 [root@liujunjun ~]# yum install -y yum-utils device-mapper-persistent-dat ...

  8. Windows10安装ubuntu16.04双系统教程

    写在前面:本教程为windows10安装ubuntu16.04(64位)双系统教程,是我多次安装双系统的经验总结,安装方法同样适用于ubuntu18.04(64位).为了直观和易于理解,我会尽量图文并 ...

  9. C++ 课程设计——电梯调度系统

    这是我在本学期C++课程最后的课程设计报告,源代码将会上传到GitHub上. 一.背景 随着经济的不断发展,越来越多的摩天大楼拔地而起,而电梯作为高层建筑物种的运送人员货物的设备也越来越被广泛使用.电 ...

  10. java基础(3):变量、运算符

    1. 变量 1.1 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为重要的知识点! 什么是变量?变量是一个内存中的小盒子(小容器), ...