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

【WPF 值转换器】ValueConverter 进阶用法

【WPF 值转换器】ValueConverter 进阶用法

  • 介绍
  • 基类实现
  • 子类实现
  • 效果

介绍

值转换器在WPF开发中是非常常见的,当然不仅仅是在WPF开发中。值转换器可以帮助我们很轻松地实现,界面数据展示的问题,如:模块隐藏显示、编码数据展示为可读内容。

实现值转换器需要继承 IValueConverter Interface,并实现 ConvertConvertBack 方法,多数情况下可以不实现 ConvertBack 方法。

一般调用采取 <MyConverter key="myConverter"> Converter="{StaticResource myConverter}" 的形式进行调用,这种方式应该是大部分人都熟知的。这种方式比较繁琐的点在于,每一个 Converter 在调用时都需要在 <xxx.Resources></xxx.Resources> 中定义资源字典,才能够使用,无论是在当前窗口资源标签中还是在 App.xaml 文件中统一定义,至少都需要进行一次定义。

还有一中方式,可以不用定义资源字典也可以使用,那就是让 Converter 实现类继承 MarkupExtension 类,当然这种方式是需要在当前 xaml 文件中引入 Converter 所在的命名空间的。其调用方式为:Converter="{xmlnsName:myConverter}"

基类实现

这里我们实现两种不同类型的 Converter 即 ValueConverter 和 MultiConverter。我们分别定义两个 BaseConverter 抽象类,名为:BaseMultiConverterBaseValueConverter

  • 单值转换类
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;public abstract class BaseValueConverter : MarkupExtension, IValueConverter
{public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);public override object ProvideValue(IServiceProvider serviceProvider) => this;
}
  • 多值转换类
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;public abstract class BaseMultiConverter : MarkupExtension, IMultiValueConverter
{public abstract object Convert(object[] values, Type targetType, object parameter, CultureInfo culture);public abstract object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture);public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

需要实现 ProvideValue 方法,当日很简单 return this 就好了。将其他的方法改为抽象方法,后续我们定义的值转换器就可以根据需要继承相应的 BaseConverter 抽象类,在实现类中实现 ConvertConvertBack 两个方法。

子类实现

前面说过,子类需要继承相应的基类,这里我们以最常用的 显示隐藏字体颜色 最为例子实现自定义的值转换器。

using System;
using System.Globalization;
using System.Windows;class BoolToVisibilityConverter : BaseValueConverter
{public bool UseHidden { get; set; }public bool Reversed { get; set; }public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is bool b){if (Reversed) b = !b;return b ? Visibility.Visible : Visibility.Collapsed;}throw new ArgumentNullException(nameof(value));}public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}
}

可以看到在上面的代码中声明了 UseHiddenReversed 两个属性,用起来也很简单直接 ‘,’ 就可以提示出来,并且值的类型也可以提示 很 nice。

请添加图片描述
请添加图片描述

using System;
using System.Globalization;
using System.Windows.Media;class MultiToColorConverter : BaseMultiConverter
{public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){return string.IsNullOrWhiteSpace(values[0].ToString()) || string.IsNullOrWhiteSpace(values[1].ToString())? Brushes.Orange: values[0].ToString() is "A" && values[1].ToString() is "B" ? Brushes.Red : Brushes.Green;}public override object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}
}

前面说了调用方式,现在来试验下。

xmlns:converter="clr-namespace:ValueConverterUse.ValueConverters" 是我实现 Converter 的命名空间,根据实际情况改变

<Windowx:Class="ValueConverterUse.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:converter="clr-namespace:ValueConverterUse.ValueConverters"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:ValueConverterUse"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"mc:Ignorable="d"><Grid Margin="20,0"><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><StackPanel VerticalAlignment="Center"><TextBoxx:Name="txt01"Margin="0,10,0,0"FontSize="20"Text="A" /><TextBoxx:Name="txt02"Margin="0,10,0,0"FontSize="20"Text="B" /><TextBlockMargin="0,10,0,0"HorizontalAlignment="Center"FontSize="24"Text="Hello"><TextBlock.Foreground><MultiBinding Converter="{converter:MultiToColorConverter}"><Binding ElementName="txt01" Path="Text" /><Binding ElementName="txt02" Path="Text" /></MultiBinding></TextBlock.Foreground></TextBlock></StackPanel><Grid Grid.Row="1"><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><BorderBackground="Green"CornerRadius="20"Visibility="{Binding ElementName=Check, Path=IsChecked, Converter={converter:BoolToVisibilityConverter}}"><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"FontSize="24"Text="显示隐藏" /></Border><ToggleButtonx:Name="Check"Grid.Row="1"Width="120"Height="40"IsChecked="True"><TextBlock Text="显示或隐藏" /></ToggleButton></Grid></Grid>
</Window>

效果

示例图片
示例图片

相关文章:

【WPF 值转换器】ValueConverter 进阶用法

【WPF 值转换器】ValueConverter 进阶用法介绍基类实现子类实现效果介绍 值转换器在WPF开发中是非常常见的&#xff0c;当然不仅仅是在WPF开发中。值转换器可以帮助我们很轻松地实现&#xff0c;界面数据展示的问题&#xff0c;如&#xff1a;模块隐藏显示、编码数据展示为可读…...

Vue2的基本使用

一、vue的基本使用 第一步 引入vue.js文件 <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script> 或者<script src"./js/vue.js"></script> 第二步 在body中设置一个挂载点 {{msg}} <div id"app…...

【云原生kubernetes】k8s数据存储之Volume使用详解

目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 4.2 EmptyDir 实现文件共享 4.2.1 关于busybox 4.3 操作步骤 4.3.1 创建配置模板文件yaml 4.3.2 创建Pod 4.3.3 访问nginx使其产生访问日志 4.3.4 …...

SerDes---CDR技术

1、为什么需要CDR 时钟数据恢复主要完成两个工作&#xff0c;一个是时钟恢复&#xff0c;一个是数据重定时&#xff0c;也就是数据的恢复。时钟恢复主要是从接收到的 NRZ&#xff08;非归零码&#xff09;码中将嵌入在数据中的时钟信息提取出来。 2、CDR种类 PLL-Based CDROve…...

如何实现在on ethernetPacket中自动回复NDP response消息

对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…...

CSS清楚浮动

先看看关于浮动的一些性质 浮动使元素脱离文档流 浮动元素可以设置宽高&#xff0c;在CSS中&#xff0c;任何元素都可以浮动&#xff0c;浮动元素会生成一个块级框&#xff0c;而不论其本身是何种元素。 如果没有给浮动元素指定高度&#xff0c;&#xff0c;那么它会以内容的…...

HTTPS详解(原理、中间人攻击、CA流程)

摘要我们访问浏览器也经常可以看到https开头的网址&#xff0c;那么什么是https&#xff0c;什么是ca证书&#xff0c;认证流程怎样&#xff1f;这里一一介绍。原理https就是httpssl&#xff0c;即用http协议传输数据&#xff0c;数据用ssl/tls协议加密解密。具体流程如下图&am…...

EventLoop机制

JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说&#xff0c;同一时间只能做一件事情。 单线程执行任务队列的问题&#xff1a; 如果前一个任务非常耗时&#xff0c;则后续的任务就不得不一直等待&#xff0c;从而导致程序假死的问题。 同步任…...

倒立摆建模

前言 系统由一辆具有动力的小车和安装在小车上的倒立摆组成&#xff0c;系统是不稳定&#xff0c;我们需要通过控制移动小车使得倒立摆保持平衡。 具体地&#xff0c;考虑二维情形如下图&#xff0c;控制力为水平力FFF&#xff0c;输出为角度θ\thetaθ以及小车的位置xxx。 力…...

SpringSecurity支持WebAuthn认证

WebAuthn是无密码身份验证技术&#xff0c;解决了密码泄露的风险&#xff0c;主流的浏览器都支持。有很多开源的类库实现了WebAuthn规范&#xff0c;Java下流行的类库有&#xff1a;webauthn4jjava-webauthn-serververtx-authSpring Security官方暂时未支持WebAuthn&#xff0c…...

深度学习技巧应用3-神经网络中的超参数搜索

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中&#xff0c;一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数&#xff0c;例如&#xff1a;学习率、正则…...

【信号量机制及应用】

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、信号量机制 二、信号量的应用 >利用信号量实现进程互斥   >利用信号量实现前驱关系   >利用记录型信号量实现同步 三、例题 四、参考 一、信号量机制 信号量是操作系统提…...

围棋高手郭广昌的“假眼”棋局

&#xff08;图片来源于网络&#xff0c;侵删&#xff09;文丨熔财经作者|易不二2022年&#xff0c;在复星深陷债务压顶和变卖资产漩涡的而立之年&#xff0c;“消失”已久的郭广昌&#xff0c;在质疑与非议声中回国稳定军心&#xff0c;强调复星将在未来的五到十年迎来一个全新…...

学成教育-统一异常处理实现

一、统一异常处理实现 统一在base基础工程实现统一异常处理&#xff0c;各模块依赖了base基础工程都 可以使用。 首先在base基础工程添加需要依赖的包&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-web</…...

JNI内通过参数形式从C/C++中传递string类型数据至Java层

目录 0 前言 1 string类型参数形式传值 2 测试和结果 0 前言 类似之前我写过的两篇文章&#xff1a;一篇介绍了在JNI中基础类型int的传值方式&#xff1b;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C中传递一维、二维、三维数组数据至Java层详细…...

自动化测试——执行javaScript脚本

文章目录一、点击元素(对应的click())二、input标签对应的值&#xff08;对应的send_keys()&#xff09;修改时间控件的属性值&#xff1a;三、元素的文本属性四、js脚本滚动操作一、点击元素(对应的click()) 使用场景&#xff1a;当使用显性等待不能解决问题时 代码中实现点击…...

常用十种算法滤波

十种算法滤波1. 限幅滤波法&#xff08;又称程序判断滤波法&#xff09;2. 中位值滤波法3. 算术平均滤波法4. 递推平均滤波法&#xff08;又称滑动平均滤波法&#xff09;5. 中位值平均滤波法&#xff08;又称防脉冲干扰平均滤波法&#xff09;6. 限幅平均滤波法7. 一阶滞后滤波…...

IO多路复用

一、概述 IO多路复用&#xff1a;进程同时检查多个文件描述符&#xff0c;以找出他们中的任何一个是否可执行IO操作。 核心&#xff1a;同时检查多个文件描述符&#xff0c;看他们是否准备好了执行IO操作。文件描述符就绪状态的转化是通过一些IO事件来触发。 二、水平触发和…...

Python中的错误是什么,Python中有哪些错误

7.1 错误(errors) 由于Python代码通常是人类编写的&#xff0c;那么无论代码是在解释之前还是运行之后&#xff0c;或多或少总会出现一些问题。 在Python代码解释时遇到的问题称为错误&#xff0c;通常是语法和缩进问题导致的&#xff0c;这些错误会导致代码无法通过解释器的解…...

记录自己开发一款小程序中所遇到的问题(uniapp+uview)(持续更新)

每次开发小程序中&#xff0c;都会遇到各种各样的问题。但是有的问题已经遇到过了&#xff0c;但是遇到的时候还是要各种的问度娘。 特此出这篇文章&#xff0c;方便自己也是方便大家。 仅供参考 1. u-collapse的样式在h5中正常&#xff0c;但是运行到微信小程序中样式就乱了…...

黄仁勋CMU演讲:取代你的是会AI的人,所有人同一起跑线,奔跑吧

老黄又当博士了。这是他的第7个荣誉博士学位&#xff0c;而且英特尔CEO陈立武亲自为其授袍。卡内基梅隆大学&#xff08;CMU&#xff09;最新一届毕业典礼上&#xff0c;黄仁勋向5800多名毕业生发表演讲。面对AI浪潮的冲击&#xff0c;所有人都在焦虑、都在担心会不会被AI取代&…...

紧急预警:Midjourney即将下架Nihonga相关风格标签?(内部消息+已存档的5类不可再生提示词组合,仅限今日开放获取)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Nihonga风格在Midjourney中的历史定位与美学内核 Nihonga&#xff08;日本画&#xff09;作为明治维新后确立的现代民族绘画体系&#xff0c;以天然矿物颜料、金箔银箔、胶质媒介及传统和纸为物质基础&…...

告别答辩PPT焦虑:百考通AI如何智能化解你的毕业展示难题

当你终于为论文画上最后一个句号&#xff0c;准备迎接毕业的曙光时&#xff0c;答辩PPT的制作却往往成为压垮学生的最后一根稻草。面对这份看似简单却暗藏玄机的任务&#xff0c;百考通AI为你提供智能解决方案。 深夜&#xff0c;当你的论文最后一个字终于落定&#xff0c;一种…...

爆单实操课:从3C到美妆,跨境商家如何用AI神器搞定TikTok本土化

每天都有无数跨境卖家在各大社群里发问&#xff1a;怎么用ai生成带货视频&#xff0c;有哪些工具比较好用&#xff1f; 在 TikTok 这个极度依赖内容爆发的平台上&#xff0c;不同类目的产品对视频素材的需求千差万别。靠人工剪辑不仅效率低&#xff0c;且极难跨越本土化语言的障…...

ElevenLabs API实战速成:从零部署高保真语音克隆服务,5步完成企业级TTS集成(含实时情感控制代码)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs超写实语音生成教程 ElevenLabs 是当前业界领先的 AI 语音合成平台&#xff0c;其模型在语调自然度、情感表达力与跨语言一致性方面表现卓越。本章将指导你完成从 API 接入到高质量语音生成的…...

初次使用Taotoken平台从注册到完成API调用的全程指引

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初次使用Taotoken平台从注册到完成API调用的全程指引 对于初次接触大模型API的开发者而言&#xff0c;从注册平台到成功发出第一个…...

Steam SDK上传游戏包体避坑指南:路径、验证码与BuildID那些事儿

Steam SDK上传游戏包体避坑指南&#xff1a;路径、验证码与BuildID那些事儿 第一次通过Steam SDK上传游戏包体时&#xff0c;开发者往往会遇到各种意料之外的"坑"。这些看似小问题却可能导致数小时的无效排查。本文将从实战角度&#xff0c;分享那些官方文档没细说但…...

Perplexity AI集成开发工具:MCP协议与零成本API实战指南

1. 项目概述&#xff1a;将Perplexity AI深度集成到你的开发工作流 如果你是一名开发者&#xff0c;或者经常需要处理信息检索、代码问题排查、技术方案调研这类工作&#xff0c;那么你肯定对“搜索”这件事又爱又恨。爱的是它能瞬间连接海量知识&#xff0c;恨的是在IDE和浏览…...

从FPGA工程师的视角看AMBA总线:手把手教你用Verilog实现一个简易APB外设

从FPGA工程师的视角看AMBA总线&#xff1a;手把手教你用Verilog实现一个简易APB外设 在FPGA和数字IC设计领域&#xff0c;AMBA总线协议就像城市中的交通网络&#xff0c;负责协调各个功能模块之间的数据流动。而APB&#xff08;Advanced Peripheral Bus&#xff09;作为AMBA家族…...

认知神经科学研究报告【20260055】

文章目录VAR 平稳向量自回归任务&#xff1a;L3 自适应涌现与 L4 经验迁移实验报告一、实验目标二、实验设计三、核心成果3.1 自主模型发现3.2 L4 跨任务经验迁移3.3 自主因果推断四、涌现层级评估六、结论VAR 平稳向量自回归任务&#xff1a;L3 自适应涌现与 L4 经验迁移实验报…...