【WPF实用教程4】自定义控件的属性和事件

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

** 作者:玖零大壮

/

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答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的各种控件和技术,来实现更加复杂和高效的自定义控件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖零大壮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值