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

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>

相关文章:

  • [特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]
  • leetcode 59. 螺旋矩阵 II
  • 大连理工大学选修——图形学:第二章 计算机图形硬件及绘图系统
  • Git推送大文件导致提交回退的完整解决记录
  • 短信侠 - 自建手机短信转发到电脑上并无感识别复制验证码,和找手机输验证码说再见!
  • LLM论文笔记 28: Universal length generalization with Turing Programs
  • 365打卡第R6周: LSTM实现糖尿病探索与预测
  • idea结合CopilotChat进行样式调整实践
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • STM32Cube-FreeRTOS任务管理工具函数-笔记
  • ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)
  • 个性化推荐:大数据引领电子商务精准营销新时代
  • 探秘 Git 底层原理:理解版本控制的基石
  • 【现代深度学习技术】现代循环神经网络06:编码器-解码器架构
  • Python基本语法(lambda表达式)
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.3 窗口函数与高级聚合(ROW_NUMBER()/RANK()/SUM() OVER())
  • 服务器部署一个千问2.5-14B、32B并发布为接口
  • 强化学习机器人模拟器——GridWorld:一个用于强化学习的 Python 环境
  • SurfSense开源程序是NotebookLM / Perplexity / Glean的开源替代品,连接到外部来源,如搜索引擎
  • 【Hive入门】Hive与Spark SQL深度集成:Metastore与Catalog兼容性全景解析
  • 《开始推理吧3》:演员没包袱,推理更共情
  • 解放日报头版:上海张江模力社区托举“年轻的事业”
  • 习近平给谢依特小学戍边支教西部计划志愿者服务队队员回信
  • 中央气象台:未来三天北方地区有大风沙尘,江南等地有强降水
  • 五一假期首日,上海外滩客流超55万人次
  • 中国队夺跳水世界杯总决赛首金