当前位置: 首页 > ai >正文

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.xdnf.cn/news/3770.html

相关文章:

  • JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
  • Python速成系列二
  • 多段线和二维多段线的区别及顶点遍历
  • Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
  • OpenHarmony平台驱动开发(一),ADC
  • 大模型实践:图文解锁Ollama在个人笔记本上部署llm
  • 一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索
  • [硬件电路-12]:LD激光器与DFB激光器功能概述、管脚定义、功能比较
  • 基于STM32的温湿度光照强度仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)
  • 使用Scrapy构建高效网络爬虫:从入门到数据导出全流程
  • 互联网与无线广播:数字时代与模拟时代的通讯双轨制-优雅草卓伊凡
  • 【iOS】 分类 拓展 关联对象
  • Dify框架面试内容整理-Dify部署后常见问题有哪些?如何排查?
  • 【SQL触发器、事务、锁的概念和应用】
  • 基于SpringBoot + HTML 的宠物医院预约管理
  • LeetCode 1128 等价多米诺骨牌对的数量 题解
  • pip安装包时网络不畅,替换国内PyPI镜像源
  • Java 集合线程安全
  • Linux | 了解Linux中的任务调度---at与crontab 命令
  • LLM论文笔记 28: Universal length generalization with Turing Programs
  • RabbitMQ入门基础
  • 250504_VsCode使用
  • 14.Excel:排序和筛选
  • 【PINN】DeepXDE学习训练营(13)——operator-antiderivative_aligned.py
  • 汇编常用语法
  • node核心学习
  • IBM DB2 两地三中心方案与配置
  • shell编程补充内容(Linux课程实验3)
  • 【SpringAI+阿里云百炼】AI对话4个Demo
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.3 异常值识别(Z-score法/IQR法/业务规则法)