1. 前言:

上一篇文章中,我演示了一个带有水印的具有清除按钮的输入框,那么这一节我准备再给输入框增加一个搜索按钮以及增加一些自定义属性和事件。本篇的工程基于 【WPF实用教程3】 最后的工程修改。

2. 背景知识

在上一篇文章中,我们已经为ClearTextBox增加了一个WaterMark的属性,如下图:

从上图中我们可以看到一些词比如Category、DependencyProperty、PropertyMeradata。其中:

  • Category装饰语句是用来对属性进行分类,[]的内容最终呈现的效果是在VS控件的属性TAB页内,如下图所示:
  • DependencyProperty叫做“依赖属性”,是WPF框架基于微软的“属性”这个概念推进衍生出的一个新的概念。简而言之,依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性,其中拥有依赖属性的对象被称为“依赖对象(Dependency Object)”。与传统的CLR属性相比,依赖属性有很多新颖之处,其中包括:节省实例对内存的开销、属性值可以通过Binding依赖在其他对象。---语句源自刘铁猛老师

举个简单的例子,以共享单车来说,我(依赖对象)拥有一辆交通工具(依赖属性),当我需要用到交通工具的时候,我选择(Binding)了一辆小黄车(数据源),这样我节省了买交通工具的钱(节省了内存开销)。PS:之前有人给我杠“那你还付小黄车的钱和押金了呢”,我回复“我去你个鬼!”

注意:使用DependencyProperty声明的成员变量所引用的实例并非使用new操作符得到,而是使用DependencyProperty.Register方法创建。

  • 关于更详细的解释,我这里暂时不解释,这部分概念很重要,需要很长的篇幅解释,我后面会单独拿出来一篇文章解释。这也是我学习的方法,先会用,再探究原理。我们现在只需要知道在自定义控件里声明一个字段的大致格式就行了。

3. 工程

3.1 为控件ClearText的清除图标添加填充色和大小两个字段

在不同的应用场景下,有时我们会对清除图标的背景色和大小需要修改,而我目前在工程中是直接写成了固定值,这样是不好的,下面我们在ClearTextBox.cs中增加以下内容:

#region 清除图标 属性
[Category("Extend Properties")]
public Brush ClearIconFill
  get { return (Brush)GetValue(ClearIconFillProperty); }
  set { SetValue(ClearIconFillProperty, value); }
public static readonly DependencyProperty ClearIconFillProperty =
            DependencyProperty.Register("ClearIconFill", typeof(Brush), typeof(ClearTextBox), new PropertyMetadata(Brushes.Gray));
[Category("Extend Properties")]
public Double ClearIconFontSize
  get { return (Double)GetValue(ClearIconFontSizeProperty); }
  set { SetValue(ClearIconFontSizeProperty, value); }
public static readonly DependencyProperty ClearIconFontSizeProperty =
            DependencyProperty.Register("ClearIconFontSize", typeof(Double), typeof(ClearTextBox));
#endregion

修改ClearTextBox\Themes.xaml中的清除按钮内容为下图:

然后修改项目MicroUI.Wpf.Samples\MainWindow.xaml中ClearTextBox控件如下:

重新生成解决方案,运行如下图:

可以看到我们自定义属性已经生效了。

3.2 添加搜索图标

我们再来给该控件加个搜索按钮以及搜索事件。

首先在Style\MicroIcon.xaml中添加搜索图标样式

<Style x:Key="MicroBtnIcon_Search" TargetType="{x:Type Button}" BasedOn="{StaticResource MicroBtnIcon}" >
        <Setter Property="Content" Value="&#xe688;" />
</Style>

其中的图标的Unicode值用你自己的图标也可以。

然后修改ClearText\Themes.xaml代码,添加箭头所指的内容:

同时增加以下内容:

<Button x:Name="PART_SearchButtonHost" Grid.Column="3" Padding="2,0" Style="{StaticResource MicroBtnIcon_Search}" FontSize="20"

重新生成解决方案,运行,如下图:

可以看到搜索按钮也有了。下面我按照上一节提到的方法,搜索按钮添加填充色和大小两个字段:

#region 搜索图标 属性
[Category("Extend Properties")]
public Brush SaerchIconFill
  get { return (Brush)GetValue(SaerchIconFillProperty); }
  set { SetValue(SaerchIconFillProperty, value); }
public static readonly DependencyProperty SaerchIconFillProperty =
  DependencyProperty.Register("SaerchIconFill", typeof(Brush), typeof(ClearTextBox), new PropertyMetadata(Brushes.Gray));
[Category("Extend Properties")]
public Double SaerchIconFontSize
   get { return (Double)GetValue(SaerchIconFontSizeProperty); }
   set { SetValue(SaerchIconFontSizeProperty, value); }
public static readonly DependencyProperty SaerchIconFontSizeProperty =
  DependencyProperty.Register("SaerchIconFontSize", typeof(Double), typeof(ClearTextBox));
#endregion

修改ClearTextBox\Themes.xaml中的搜索按钮内容如下:

修改MicroUI.Wpf.Samples中的MainWindow.xaml的ClearTextBox内容如下:

重新生成解决方案,运行:

此时的样式还是可以的。

3.3 添加自定义事件

接下来,我们给搜索按钮添加一个自定义事件,使得用户可以订阅该点击事件从而执行搜索逻辑。

在ClearTextBox.cs中添加下图箭头所指的两处:

同样的在该文件中添加:

#region 自定义按钮事件
[Category("Behavior")]
public static readonly RoutedEvent OnSearchEvent =
  EventManager.RegisterRoutedEvent(
  "OnSearch",
  RoutingStrategy.Bubble,
  typeof(RoutedEventHandler),
  typeof(ClearTextBox));
public event RoutedEventHandler OnSearch
  add { AddHandler(OnSearchEvent, value); }
  remove { RemoveHandler(OnSearchEvent, value); }
#endregion

继续添加事件处理方法:

//搜索按钮处理方法 private void HandleOnSearchClick(object sender, RoutedEventArgs e) this.RaiseEvent(new RoutedEventArgs(ClearTextBox.OnSearchEvent, this));

在OnApplyTemplate()方法中添加以下语句:

if (searchButtonHost != null) searchButtonHost.Click -= HandleOnSearchClick; searchButtonHost = GetTemplateChild("PART_SearchButtonHost") as ButtonBase; if (searchButtonHost != null) searchButtonHost.Click += HandleOnSearchClick;

此时自定义控件的内容添加完毕,接下来去MainWindow.xaml中添加订阅事件:

MainWindow.xaml.cs中的事件处理方法为:

重新生成解决方案,运行:

可以看到订阅的事件被触发。

3.4 小节

通过本篇可以学到的知识点:

  • 自定义控件添加依赖属性

  • 自定义控件添加自定义事件

** 原创文章,转载请附该部分声明

** 来源: https://blog.csdn.net/mybelief321

** 作者:玖零大壮

1. 前言:上一篇文章中,我演示了一个带有水印的具有清除按钮的输入框,那么这一节我准备再给输入框增加一个搜索按钮以及增加一些自定义属性和事件。本篇的工程基于【WPF实用教程3】最后的工程修改。2. 背景知识在上一篇文章中,我们已经为ClearTextBox增加了一个WaterMark的属性,如下图:从上图中我们可以看到一... &lt;Button x:Class="UserButtonTest.MyUserButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" static CustomDetails() DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomDetails), new FrameworkPropertyMetadata(typeof(CustomDetails))); public.
我等屌丝终于接触数据库了,打算使用c#的窗体程序操作数据库,今天刚安装好SQL Server 2008,按照网上的教程编写好c#程序结果出现用户登录失败的,现将的步骤截图保存,包括数据库建立和c#窗体程序。 一、创建SQL数据库 1、开始\所有程序\SQL Server
1. 先创建一个简单的 WPF 样例,并逐步将它重构成为MVVM模式。    这个Demo需求是:在界面上放置文本框用来显示 定义 的类Student 的名字,放置Button来修改Student的名字。    刚创建好的样例工程文档如下图:   紧接着添加一个Student类, using System; using System.Collections.Generic; using
### 回答1: WPF ComboBox 和 TreeView 都是 WPF 控件库 非常实用的控件,它们可以在应用程序 提供灵活性以及可扩展性。在 WPF ,开发人员可以使用自 定义 数据模型为 ComboBox 和 TreeView 创建自 定义 数据源,以支持针对具有复杂数据结构的对象的数据绑定。 自 定义 WPF ComboBox 控件可以通过创建 自定义控件 模板来实现。开发人员可以使用 XAML 和控件模板 定义 ComboBox 的外观和行为,并使用代码实现控件的行为。例如,可以使用控件模板将 ComboBox 的列表项设计成树形结构,以支持绑定到具有层次结构的数据模型。 自 定义 WPF TreeView 控件可以通过创建 自定义控件 模板和自 定义 ItemTemplate 来实现。控件模板 定义 TreeView 的外观和行为,而 ItemTemplate 用于 定义 TreeView 每个节点的外观和行为。开发人员可以在 ItemTemplate 添加控件,如 Button、CheckBox 或 RadioButton,以在 TreeView 节点的视觉表示 添加交互元素。还可以使用 ItemContainerStyle 属性 定义 节点的容器风格,包括每个节点应如何显示。 总之,自 定义 WPF ComboBox 和 TreeView 控件可以帮助开发人员创建更具交互性和可视化效果的应用程序。通过使用 自定义控件 模板和数据绑定功能,可以轻松地确保这些控件与数据模型的各个部分保持同步,并以最佳方式展现数据。 ### 回答2: WPF 的ComboBox和TreeView是非常有用的控件,它们可以满足不同场合下的数据呈现和交互需求。如果需要自 定义 这两个控件,可以按照以下步骤进行: 1. 自 定义 ComboBox:通过继承ComboBox类来自 定义 ComboBox,可以在构造函数 初始化控件外观和行为,还可以添加需要的 事件 。 2. 自 定义 TreeView:通过继承TreeView类来自 定义 TreeView,可以在构造函数 初始化控件外观和行为,还可以添加需要的 事件 。如果需要添加节点的复选框或者自 定义 节点模板,可以重写TreeViewItem类。 3. 自 定义 ComboBox 的TreeView:在ComboBox控件 添加TreeView控件,通过设置TreeView的样式、模板和 事件 来自 定义 TreeView。 4. 数据绑定:通过数据绑定来绑定ComboBox和TreeView,可以将数据源绑定到ComboBox或者TreeView ,并在需要的 事件 更新数据。 5. 效率优化:如果需要展示大量的节点,可以采用虚拟化技术,例如使用VirtualizingStackPanel控件来优化TreeView的性能。 总之,自 定义 WPF 的ComboBox和TreeView可以使其更加符合实际需求,提高用户体验和效率。 ### 回答3: WPF 的ComboBox和TreeView控件都是非常常见且灵活的控件,但是在某些特定的应用场景 ,我们可能需要对其进行定制化,以满足特定的需求。因此,我们可以对这些控件进行自 定义 ,使其更加符合我们的业务逻辑和界面设计。 对于ComboBox控件,我们可以通过绑定数据源和设置模板,来实现自 定义 下拉列表的样式和内容。如果需要实现ComboBox的级联功能,我们可以借助于其它控件之间的数据绑定,或者使用第三方开源控件实现。另外,我们还可以通过重写ComboBox的样式文件,来实现自 定义 ComboBox的外观和交互效果。 对于TreeView控件,我们可以通过绑定数据源和设置模板,来自 定义 其节点的样式、内容和布局。如果需要实现TreeView的多选功能,我们可以使用自 定义 的TreeViewItem,并在其上添加CheckBox控件。另外,我们还可以通过重写TreeView的样式文件,来实现自 定义 TreeView的外观和交互效果。 无论是ComboBox还是TreeView,我们都可以使用 自定义控件 的方式进行定制化,以满足不同的应用场景和设计要求。同时,我们也可以借助于 WPF 的各种控件和技术,来实现更加复杂和高效的 自定义控件