文章目录

  • 一、用户控价
    • 1.1 依赖属性的注册
    • 1.2 具体使用

一、用户控价

1.1 依赖属性的注册

using System.Windows;
using System.Windows.Controls;namespace WpfApp
{public partial class MyUserControl : UserControl{// 依赖属性:外部可绑定的文本public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",typeof(string),typeof(MyUserControl),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,OnTextPropertyChanged));public string Text{get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);}// 自定义事件:提交按钮点击public static readonly RoutedEvent SubmitClickedEvent =EventManager.RegisterRoutedEvent("SubmitClicked",RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(MyUserControl));public event RoutedEventHandler SubmitClicked{add => AddHandler(SubmitClickedEvent, value);remove => RemoveHandler(SubmitClickedEvent, value);}public MyUserControl(){InitializeComponent();DataContext = new MyUserControlViewModel(this);}private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (MyUserControl)d;control.RaiseEvent(new RoutedEventArgs(SubmitClickedEvent));}}
}

这段代码是在WPF中注册依赖属性(Dependency Property) 的标准写法,下面来详细解释它的作用和参数含义:

1. 函数整体作用
DependencyProperty.Register 是WPF中创建依赖属性的核心方法。它做了两件事:

  • 定义属性元数据:包括属性名称、类型、所有者类型、默认值等。
  • 返回属性标识符:通过静态字段(如 TextProperty)保存,用于后续通过 GetValue/SetValue 访问属性值。

2. 参数详解

public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",                  // 参数1:属性名称(字符串)typeof(string),          // 参数2:属性类型(Type)typeof(MyUserControl),   // 参数3:所有者类型(Type)new FrameworkPropertyMetadata(  // 参数4:元数据string.Empty,    // 默认值FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,  // 绑定模式OnTextPropertyChanged  // 值变更回调));

参数1:“Text”

  • 含义:这是依赖属性的名称,必须与CLR包装器属性名一致(即类中的 public string Text { get; set; })。
  • 作用:WPF内部通过这个名称识别属性,例如在XAML中使用 <MyUserControl Text="Hello" />

参数2:typeof(string)

  • 含义:属性的类型,这里是字符串类型。
  • 作用:确保属性值类型安全,WPF会自动进行类型检查。

参数3:typeof(MyUserControl)

  • 含义:声明该依赖属性的所有者类型,即哪个类拥有这个属性。
  • 作用:允许同一个依赖属性被多个类共享(通过 AddOwner 方法),但这里 MyUserControl 是原始所有者。

参数4:FrameworkPropertyMetadata

  • 默认值(string.Empty):属性未被显式设置时的默认值。
  • 绑定模式(BindsTwoWayByDefault)
    • 表示此属性的默认绑定模式是双向绑定(Mode=TwoWay)。
    • 例如:<MyUserControl Text="{Binding SomeValue}" /> 会自动成为双向绑定。
  • 回调方法(OnTextPropertyChanged)
    • 当属性值变化时,WPF会自动调用这个静态方法。
    • 常用于实现属性变更通知或依赖操作。

3. 参数"Text"属于谁?
参数 "Text"MyUserControl 类的公共属性。通过依赖属性机制,这个属性:

  1. 可在XAML中直接使用
    <local:MyUserControl Text="直接设置值" />
    
  2. 支持数据绑定
    <local:MyUserControl Text="{Binding ViewModelProperty}" />
    
  3. 可通过代码访问
    myUserControl.Text = "通过代码设置";
    

4. 依赖属性 vs 普通属性

特性普通属性依赖属性
存储方式实例字段(如 private string _text由WPF属性系统统一管理
默认值在构造函数中设置通过元数据设置(全局唯一)
数据绑定需要手动实现 INotifyPropertyChanged原生支持,自动通知
样式/动画支持不支持支持(可被样式覆盖、可动画化)
继承性部分属性支持值继承(如 FontSize

※※※
5. 完整工作流程

  1. 注册阶段

    • 通过 DependencyProperty.Register 创建属性定义。
    • 静态字段 TextProperty 保存属性标识符。
  2. CLR包装器(可选但推荐):

    public string Text
    {get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);
    }
    
  3. 使用阶段

    • XAML中:<MyUserControl Text="值" />
    • 代码中:myControl.Text = "值";
    • 数据绑定时:WPF通过 TextProperty 标识符解析属性。

总结

  • “Text” 参数:是 MyUserControl 类的公共属性名,用于外部访问。
  • 依赖属性机制:让属性具备动态值解析、数据绑定、样式支持等高级特性,是WPF控件开发的核心技术。

1.2 具体使用

MainWindow.xaml

<Window x:Class="WpfApp2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><local:UserControl1 Margin="10" Height="200" Width="250" x:Name="userControl"/><Button Content="button1" Click="Button_Click_1"/><Button Content="button2" Click="Button_Click_2"/></StackPanel></Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp2
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Button_Click_1(object sender, RoutedEventArgs e){userControl.Text = "你大爷";}private void Button_Click_2(object sender, RoutedEventArgs e){userControl.Text = "你 好";}}
}

UserControl1.xaml

<UserControl x:Class="WpfApp2.UserControl1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d" d:DesignHeight="100" d:DesignWidth="200"><Grid><TextBox x:Name="txtInput" Margin="10" /><Button Content="提交" Click="Button_Click" Margin="10,50,10,10" /><TextBlock x:Name="lblOutput" Margin="10,90,10,10" /></Grid>
</UserControl>

UserControl1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp2
{/// <summary>/// UserControl1.xaml 的交互逻辑/// </summary>public partial class UserControl1 : UserControl{public UserControl1(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){lblOutput.Text = "你输入的是:" + txtInput.Text;}public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",                // 属性名typeof(string),        // 属性类型typeof(UserControl1), // 所有者类型new PropertyMetadata(  // 元数据string.Empty,      // 默认值OnTextPropertyChanged  // 值变更回调));public string Text{get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);}private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (UserControl1)d;control.lblOutput.Text = "属性值:" + e.NewValue;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90186.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90186.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90186.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+typescript项目配置路径别名@

1. vite.config.ts配置//方法1 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import path from path;export default defineConfig({plugins: [vue()],resolve: {alias: {: path.resolve(__dirname, src)}} });//方法2,需要执行npm install -D type…

MySql 常用SQL语句、 SQL优化

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨SQL语句主要分为哪几类 SQL&#xff08;结构化查询语言&#xff09;是用于管理和操作关系型数据库的标准语言&#xff0c;其语句通常根据功能划分为以下几大类&#xff0c;每类包含不同的子句和命令&#xff0c;用于实现特定的数据库操作需求&am…

代理模式实战指南:打造高性能RPC调用与智能图片加载系统

代理模式实战指南&#xff1a;打造高性能RPC调用与智能图片加载系统 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量…

登山第二十六梯:单目3D检测一切——一只眼看世界

文章目录 一 摘要 二 资源 三 内容 一 摘要 尽管深度学习在近距离 3D 对象检测方面取得了成功&#xff0c;但现有方法难以实现对新对象和相机配置的零镜头泛化。我们介绍了 DetAny3D&#xff0c;这是一种可提示的 3D 检测基础模型&#xff0c;能够在任意相机配置下仅使用单目…

ROS2简记一:第一个ros2程序,海龟模拟与C++和python的《你好,世界!》

目录 引言 一、控制小海龟 二、键盘控制海龟 三、控制海龟案例的简单分析 四、ROS2之linux基础 4.1 linux终端命令 4.1.1 查看当前终端所在目录 pwd 4.1.2 切换终端所在目录 cd 4.1.3 查看当前目录下的文件 ls 4.1.4 主目录 ~ 4.1.5 文件的操作 4.1.6 命令使用帮助…

监控的基本理论和prometheus安装

监控的基本理论和prometheus安装 前言 这篇博客主要讲的是关于理论的知识&#xff0c;大家尽可能的消化和吸收&#xff0c;也能扩展大家的知识面 监控的基本概念 监控俗称为运维的第三只眼。没有了监控&#xff0c;业务运维都是“瞎子”。所以说监控室运维这个职业的根本&…

互联网生态下赢家群体的崛起与“开源AI智能名片链动2+1模式S2B2C商城小程序“的赋能效应

摘要&#xff1a;本文聚焦未来互联网赢家群体的构成特征&#xff0c;剖析网红经济与专业主播的差异化发展路径&#xff0c;结合开源AI智能名片链动21模式与S2B2C商城小程序的融合创新&#xff0c;提出技术赋能下互联网商业生态的重构路径。研究表明&#xff0c;开源AI技术通过智…

OneCode 图表组件核心优势解析

一、全方位的可视化能力 OneCode 图表组件提供了15种专业图表类型&#xff0c;覆盖从基础到高级的数据可视化需求&#xff1a; 基础图表&#xff1a;柱状图、折线图、饼图、面积图等高级图表&#xff1a;金字塔图、雷达图、仪表盘、LED图表等实时图表&#xff1a;实时折线图、实…

【Linux】RHCE中ansible的配置

1.安装并配置ansible 第一步先安装ansible所需软件 #安装ansible所需软件 [devopsworkstation ~]$ sudo dnf install ansible ansible-navigator rhel-system-roles -y 第二步登录镜像仓库&#xff0c;在镜像仓库下载镜像容器来运行ansible 由于ansible-navigator 知ansible…

ubuntu server系统 安装宝塔

更新系统软件包sudo apt update && sudo apt upgrade -y提示&#xff0c;如果想博主这样是存绿色liunx系统&#xff0c;要先安装python3脚本才可以python3 --version有pyhton版本号就是安装了&#xff0c;没有的话就要安装安装 Pythonsudo apt update sudo apt install…

用C++实现五子棋游戏

#include <iostream> #include <vector> #include <string> #include <iomanip> // 用于控制输出格式 #include <limits> // 用于numeric_limitsusing namespace std;// 游戏常量定义 const int BOARD_SIZE 15; // 定义棋盘大小为15x15// 棋…

【LeetCode 热题 100】73. 矩阵置零——(解法一)空间复杂度 O(M + N)

Problem: 73. 矩阵置零 题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(M * N)空间复杂度&#xff1a;O(M N)整体思路…

【深度学习新浪潮】国内零样本抗体设计的科研进展如何?

什么是AI零样本抗体设计? AI零样本抗体设计(Zero-shot AI Antibody Design)是指不依赖任何已知抗体序列或结构数据,仅根据靶点抗原信息,通过人工智能直接生成具有高亲和力、高特异性的全新抗体序列的技术。其核心在于突破传统抗体研发的“数据依赖瓶颈”,实现真正的“从…

【论文阅读】A Diffusion model for POI recommendation

论文出处&#xff1a;ACM Transactions on Information Systems (TOIS) SCI一区 CCF-A期刊 论文地址&#xff1a;[2304.07041] A Diffusion model for POI recommendation 论文代码&#xff1a;Yifang-Qin/Diff-POI: The official PyTorch implementation of Diff-POI. 目…

Rust实现FasterR-CNN目标检测全流程

使用 Rust 和 FasterR-CNN 进行目标检测 FasterR-CNN 是目标检测领域广泛使用的深度学习模型。Rust 生态中可以通过 tch-rs(Torch 绑定)调用预训练的 PyTorch 模型实现。以下为完整实现步骤: 环境准备 安装 Rust 和必要的依赖: cargo add tch cargo add anyhow # 错误…

Github 2025-07-03Go开源项目日报Top10

根据Github Trendings的统计,今日(2025-07-03统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10JavaScript项目2Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revise…

XML Schema 安装使用教程

一、XML Schema 简介 XML Schema&#xff08;XSD&#xff0c;全称 XML Schema Definition&#xff09;是用于定义 XML 文档结构、数据类型和数据约束的标准方式。它比 DTD 更加强大&#xff0c;支持数据类型、默认值、命名空间等&#xff0c;是企业级 XML 应用推荐的验证方式。…

【字节跳动】数据挖掘面试题0008:计算西瓜视频内容好评率

文章大纲题目描述题目描述 西瓜视频近期开展了”2020百大人气创作者”优质内容扶持项目&#xff0c;鼓励用户产出优质的视频内容。 现需要统计2020年11月01日至2020年11月30日期间创作的视频中&#xff0c; “科技”大类下“数码测评"子类的视频好评率&#xff08;好评率好…

Linux 进程控制:全面深入剖析进程创建、终止、替换与等待

文章目录引言一、进程创建&#xff1a;fork()系统调用的奥秘1.1 fork()的基本原理1.2 代码示例与解读1.3 写时复制&#xff08;COW&#xff09;优化二、进程终止&#xff1a;exit()与_exit()的抉择2.1 exit()和_exit()的区别2.2 代码示例与分析三、进程替换&#xff1a;exec()函…

PJSIP 中的 TCP 传输配置指南

PJSIP 支持通过 TCP 传输 SIP 消息&#xff0c;相比 UDP 提供了更可靠的传输机制。以下是关于在 PJSIP 中使用 TCP 的详细指南。1. 创建 TCP 传输基本 TCP 传输配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…