WPF中Behaviors

行为的好处

可以把复杂的界面逻辑抽象出去,让xaml的界面设计更简单,更清爽

1.安装包

Microsoft.Xaml.Behaviors.Wpf

2.简单实现拖动效果

<Border Width="100"Height="100"Background="Red"><i:Interaction.Behaviors><i:MouseDragElementBehavior /></i:Interaction.Behaviors>
</Border>

3.简单自定义一个行为

定义一个情况文本框的行为

public class ClearTextBoxBehavior : Behavior<Button>
{// 定义依赖属性,用于绑定目标 TextBoxpublic TextBox TargetTextBox{get => (TextBox)GetValue(TargetTextBoxProperty);set => SetValue(TargetTextBoxProperty, value);}public static readonly DependencyProperty TargetTextBoxProperty =DependencyProperty.Register(nameof(TargetTextBox),typeof(TextBox),typeof(ClearTextBoxBehavior),new PropertyMetadata(null));protected override void OnAttached(){base.OnAttached();AssociatedObject.Click += OnButtonClick; // 订阅按钮点击事件}protected override void OnDetaching(){base.OnDetaching();AssociatedObject.Click -= OnButtonClick; // 清理事件}private void OnButtonClick(object sender, RoutedEventArgs e){TargetTextBox?.SetCurrentValue(TextBox.TextProperty, string.Empty); // 清空文本框TargetTextBox?.Focus(); // 可选:清空后聚焦文本框}
}

引入

xmlns:local1="clr-namespace:TestBinding.Behaviors"
<StackPanel><TextBox Height="30"Name="txtInput"></TextBox><Button Height="30"><i:Interaction.Behaviors><local1:ClearTextBoxBehavior TargetTextBox="{Binding ElementName=txtInput}" /></i:Interaction.Behaviors></Button>
</StackPanel>

一个可以按上键增加值下键减少值的TextBox

public class NumericUpDownBehavior : Behavior<TextBox>
{// 定义依赖属性:最小值、最大值、步长public double Min{get => (double)GetValue(MinProperty);set => SetValue(MinProperty, value);}public static readonly DependencyProperty MinProperty =DependencyProperty.Register(nameof(Min),typeof(double),typeof(NumericUpDownBehavior),new PropertyMetadata(double.MinValue)); // 默认无下限public double Max{get => (double)GetValue(MaxProperty);set => SetValue(MaxProperty, value);}public static readonly DependencyProperty MaxProperty =DependencyProperty.Register(nameof(Max),typeof(double),typeof(NumericUpDownBehavior),new PropertyMetadata(double.MaxValue)); // 默认无上限public double Step{get => (double)GetValue(StepProperty);set => SetValue(StepProperty, value);}public static readonly DependencyProperty StepProperty =DependencyProperty.Register(nameof(Step),typeof(double),typeof(NumericUpDownBehavior),new PropertyMetadata(1.0)); // 默认步长=1protected override void OnAttached(){base.OnAttached();AssociatedObject.PreviewKeyDown += OnKeyDown;AssociatedObject.LostFocus += OnLostFocus;}protected override void OnDetaching(){base.OnDetaching();AssociatedObject.PreviewKeyDown -= OnKeyDown;AssociatedObject.LostFocus -= OnLostFocus;}private void OnKeyDown(object sender, KeyEventArgs e){if (e.Key == Key.Up || e.Key == Key.Down){// 解析当前值(兼容不同文化的小数点)var text = AssociatedObject.Text.Replace(",", "."); // 统一小数点格式if (!double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out var currentValue))currentValue = 0;// 计算新值并限制范围var step = e.Key == Key.Up ? Step : -Step;currentValue = Math.Clamp(currentValue + step, Min, Max);// 更新文本框AssociatedObject.Text = currentValue.ToString(CultureInfo.InvariantCulture);AssociatedObject.CaretIndex = AssociatedObject.Text.Length;e.Handled = true;}}private void OnLostFocus(object sender, RoutedEventArgs e){// 失去焦点时格式化并重新检查范围if (double.TryParse(AssociatedObject.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out var value)){var clampedValue = Math.Clamp(value, Min, Max);AssociatedObject.Text = clampedValue.ToString(CultureInfo.InvariantCulture);}else{AssociatedObject.Text = Min.ToString(CultureInfo.InvariantCulture); // 非法输入时重置为最小值}}
}

输入时可以定制最大值、最小值、步长

<TextBox Height="30"Name="txtInput"><i:Interaction.Behaviors><local1:NumericUpDownBehavior Max="100" Min="0" Step="3" /></i:Interaction.Behaviors>
</TextBox>

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

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

相关文章

GitHub 趋势日报 (2025年05月03日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…

Oracle OCP认证考试考点详解083系列08

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 36. 第36题&#xff1a; 题目 解析及答案&#xff1a; 关于数据库闪回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象&#xff08;如表、索引、列等&#xff09;的元数据信息&#xff0c;帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍&#xff1a; 一、统计信息的分类 表统…

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求&#xff0c;dp[i]表示&#xff1a;到达i位置&#xff0c;一共有多少种方法 2、状态转移方程 以i位置的状态&#xff0c;以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后台管理系统模板

Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板&#xff0c;集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技术栈开…

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…

Python格式化字符串的四种方法

Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符&#xff0c;而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出&#xff1a;Hello, World!你可以使用多个占位符 注意&#xff1a;多个变量占位&#xff0c;变量要…

【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图&#xff1a; Redis最主要的用途&#xff0c;三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;redis最常用的场景&#xff09; 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说&#xff0c;通常情况下&#xff1…

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略&#xff1a;以数据为核心的交易思维 在动态交易市场中&#xff0c;如何在波动中捕捉相对确定的趋势&#xff0c;是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析&#xff0c;判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…

React useMemo函数

第一个参数是回调函数&#xff0c;返回计算的结果&#xff0c;第二个参数是依赖项&#xff0c;该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前&#xff0c;我们先来简单了解一下什么是通义灵码 Project Rules&#xff1f; 大家都知道&#xff0c;在使用 AI 代码助手的时候&#xff0c;有时候生成的代码不是自己想要的&#xff0c;或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…

list的设计

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止权限放大&#xff0c;用引用减少拷贝…

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…