WPF开发快速入门【3】WPF的基本特性(附加属性)
概述
本文描述WPF的附加属性。对于使用MVVM框架的项目,附加属性是非常重要的一个特性。
在MVVM框架下,ViewModel的代码通过控件的依赖属性来控制控件的,例如:
//ViewModel
public Visibility GridVisibility {get;set} public void Show()
{
GridVisibility = Visibility.Visible;
} public void Hide()
{
GridVisibility = Visibility.Collapsed;
} //View
<Grid Visibility="{Binding GridVisibility}">
</Grid>
可以看出,我们通过修改GridVisibility 的值就改变了Grid的状态。
现在有一个需求,要求在执行某个命令时,将输入焦点定位到一个TextBox,我想TextBox是否有一个属性:IsFocused?有就简单了!事实上TextBox并没有这个依赖属性,这就麻烦了。如果不采用MVVM,我在代码中执行txtBoxName.Focus();也就搞定了,但MVVM模式下没有这种操作。这时候附加属性就派上用场了。
你没有IsFocused这个属性,我给你加一个:
public class TextBoxHelper
{
/// <summary>
/// 附加属性:IsFocused
/// </summary>
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached("IsFocused",
typeof(bool),
typeof(TextBoxHelper),
new FrameworkPropertyMetadata(false, OnIsFocusedPropertyChanged)); public static void SetIsFocused(DependencyObject dp, bool value)
{
dp.SetValue(IsFocusedProperty, value);
} public static bool GetIsFocused(DependencyObject dp)
{
return (bool)dp.GetValue(IsFocusedProperty);
} private static void OnIsFocusedPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
if ((bool)e.NewValue)
{
textBox.Focus();
textBox.SelectAll();
}
}
}
以上就是这个附加属性的定义。下面需要把这个属性提供给控件:
<UserControl x:Class="LearnWPF.Pages.PageBasicCharacteristicView"
xmlns:xy="clr-namespace:LearnWPF.Controls.Helper;assembly=LearnWPF.Controls">
<TabControl>
<TabItem Header="附加属性">
<Grid>
<TextBox xy:TextBoxHelper.IsFocused="{Binding IsTextBox2Focused}"/>
<Button Content="Focus TextBox2" Command="{s:Action FocusTextBox2}"/>
</Grid>
</TabItem>
</TabControl>
</UserControl>
然后,ViewModel中操作 IsTextBox2Focused即可控制TextBox的焦点了。
public class PageBasicCharacteristicViewModel : Screen
{
public bool IsTextBox2Focused { get; set; } public void FocusTextBox2()
{
IsTextBox2Focused = true;
}
}
资源
系列目录:WPF开发快速入门【0】前言与目录
代码下载:Learn WPF: WPF学习笔记 (gitee.com)
WPF开发快速入门【3】WPF的基本特性(附加属性)的更多相关文章
- WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)
概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...
- WPF/MVVM Quick Start Tutorial - WPF/MVVM 快速入门教程 -原文,翻译及一点自己的补充
转载自 https://www.codeproject.com/articles/165368/wpf-mvvm-quick-start-tutorial WPF/MVVM Quick Start T ...
- Transform组件C#游戏开发快速入门
Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 ...
- HealthKit开发快速入门教程之HealthKit数据的操作
HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- 游戏控制杆OUYA游戏开发快速入门教程
游戏控制杆OUYA游戏开发快速入门教程 1.2.2 游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4 游戏控制杆各个角度的 ...
- SpringBoot开发快速入门
SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...
- 【翻译】WPF应用程序模块化开发快速入门(使用Prism+MEF)
编译并运行快速入门 需要在VisualStudio 2010上运行此快速入门示例 代码下载:ModularityWithMef.zip 先重新生成解决方案 再按F5运行此示例 说明: 在此快速入门示例 ...
随机推荐
- Avalonia下拉可搜索树(TreeComboBox)
1.需求分析 树形下拉的功能是ComboBox和TreeView的功能结合起来,再结合数据模板来实现这一功能. 2.代码实现 1.创建UserControl集成TreeView控件 2.将 ...
- Hypium框架使能ArkTS应用高效测试
原文链接:https://mp.weixin.qq.com/s/Ncc-x_4zy4wBZmSjknw1lQ,点击链接查看更多技术内容: HarmonyOS发布了声明式开发框架ArkUI,带来了 ...
- 编程小白也能快速掌握的ArkUI JS组件开发
原文:https://mp.weixin.qq.com/s/ByxCMvtxaNuKI_6cXgtLBg,点击链接查看更多技术内容. Playground自上线以来,得到了广大开发者的一致好评.特别是 ...
- js es6 模板字符
前言 es的模板字符,也就是定义了块的概念. 模板字符的二个条件: 1.必须在``中,这个`不是单引号而是反单引号,是tab的上面一个. 2.在#{}中,这个就有点意思了,里面不像后台的块级,在这里不 ...
- 使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)
首先需要准备好数据集,这里有labelme标签数据转coco数据集标签的说明:labelme转coco数据集 - 一届书生 - 博客园 (cnblogs.com) 1. 准备工作目录 我们的工作目录, ...
- 实训篇-Html-表单练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【Oracle】 管道函数pipelined function简单的使用
Oracle 管道函数pipelined function简单的使用 如果在函数(function)中加关键字 pipelined,就表明这是一个oracle管道函数,其返回值类型必为 集合,体现出来 ...
- 阿里云实时数仓Hologres年度发布,解读数仓新趋势
简介:阿里云实时数仓Hologres年度发布,解读数仓新趋势. 1月7日,阿里云实时数仓Hologres发布最新版本,在成本.可用性.在线高可用等多方面进行了能力升级,行存吞吐提升100%,列存吞吐 ...
- 内含干货PPT下载|一站式数据管理DMS及最新解决方案发布
简介: 今天主要给大家介绍一站式数据管理平台DMS以及解决方案的发布.议题包含企业数据管理当前的一些痛,DMS一站式数据管理平台以及其核心技术,实时数仓解决方案以及相应的应用实践. "数聚 ...
- [FAQ] 腾讯企业邮箱成员的名字如何多次更改 ?
可以通过给成员的邮箱增加别名,先点击成员信息最右侧的 "编辑",在编辑页面顶部的 "更多操作" 这个按钮中,比较隐蔽. Refer:腾讯邮箱成员名字更改 Lin ...