【小技巧积累】用Style实现必填提示“*”根据选项的不同而显示或隐藏
1.问题需求
有一个界面,界面上有一组单选按钮(一个是“可选”,另一个是“必填”),还有一个“备注”信息的文本输入框。现在要求在选择“必填”时,“备注”信息不能为空,此时应该在“备注”文本框前显示必填标志(常用的是“*”),如图2所示;而在选在“可选”时,“备注”信息可为空,此时必填标志“*”应该隐藏起来,如图1所示。
图1 备注可选
图2 备注必填
2.问题分析
当然,这个问题实际上很简单。如果是文本“备注”是通过TextBlock和文本输入框放在同一个GroupBox中,那么我们可以在“备注”TextBlock和文本输入框之间加一个显示“*”的TextBlock(为了描述方便,假设将其命名为tbStar)。则在选择“可选”时,将tbStar的Visibility属性设置为Hidden(隐藏);而在选择“必填”时,将tbStar的Visibility属性设置为Visible(可见)。至于,如何响应选择“可选”还是选择“必填”,我们可以使用事件和可以使用命令,这个不是这里要讲的重点,我们下面的代码中用了命令。
但是,通过图1和图2,我们看到此处的难点是:“备注”和“*”不是显示在GroupBox控件内部的,而是显示在GroupBox的Header属性中的。对于Header属性的设置,我们不可能直接将两个TextBlock控件(一个用于显示“备注”,一个用于显示“*”)设置为其值。于是,我们这里采用样式Style来实现。
3.实现代码
关于界面的XAML代码如下所示:
1 <Window x:Class="WPFTestDemo.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow" Height="350" Width="525"> 5 <Window.Resources> 6 <Style x:Key="setHeaderStyle" TargetType="GroupBox"> 7 <Setter Property="Header"> 8 <Setter.Value> 9 <StackPanel Orientation="Horizontal"> 10 <TextBlock Text="备注" /> 11 <TextBlock x:Name="txtStar" Text="*" Foreground="Red" Visibility="Collapsed"/> 12 </StackPanel> 13 </Setter.Value> 14 </Setter> 15 </Style> 16 </Window.Resources> 17 <Grid> 18 <Grid.RowDefinitions> 19 <RowDefinition Height="*" /> 20 <RowDefinition Height="3*" /> 21 </Grid.RowDefinitions> 22 <GroupBox Grid.Row="0" Margin="4" > 23 <StackPanel Orientation="Horizontal"> 24 <RadioButton VerticalAlignment="Stretch" Content="可选" IsChecked="True" 25 Command="{Binding Command}" CommandParameter="NoNeed"/> 26 <RadioButton VerticalAlignment="Stretch" Content="必填" 27 Command="{Binding Command}" CommandParameter="Need"/> 28 </StackPanel> 29 </GroupBox> 30 <GroupBox Grid.Row="1" Margin="4" Style="{StaticResource setHeaderStyle}"> 31 <TextBox ></TextBox> 32 </GroupBox> 33 </Grid> 34 </Window>
从上面的代码第30行可见,控件GroupBox引用了静态资源setHeaderStyle。而从第6-15行可见,资源setHeaderStyle通过Setter设置了GroupBox的Header属性为一个StackPanel控件,而在StackPanel中提供了两个TextBlock,一个显示“备注”,一个显示“*”。第24-27行代码显示我们通过命令来响应单选按钮“可选”和“必填”的选择,这里的命令绑定到DataContext的Command属性。下面是界面的视图代码实现,
1 public partial class MainWindow : Window 2 { 3 private ViewModel viewModel = new ViewModel(); 4 5 public MainWindow() 6 { 7 InitializeComponent(); 8 this.DataContext = this.viewModel; 9 this.viewModel.Command.ExecuteEvent += new Action<Object>( 10 delegate(object obj) 11 { 12 OptionEnum oe = OptionEnum.NoNeed; 13 Enum.TryParse<OptionEnum>((string)obj, out oe); 14 if (oe == OptionEnum.NoNeed) 15 { 16 TextBlock tb = GetTextBlockStar(); 17 tb.Visibility = Visibility.Hidden; 18 } 19 else 20 { 21 TextBlock tb = GetTextBlockStar(); 22 tb.Visibility = Visibility.Visible; 23 } 24 }); 25 } 26 private TextBlock GetTextBlockStar() 27 { 28 Style style = (Style)this.FindResource("setHeaderStyle"); 29 Setter sb = (Setter)style.Setters[0]; 30 StackPanel sp = (StackPanel)sb.Value; 31 return (TextBlock)sp.Children[1]; 32 } 33 }
上面代码中的第9-24行的代码就是定义了用于响应单选按钮选择的命令,在第16-17行时,判断出选择了“可选”单选按钮,此时设置显示“*”的TextBlock控件的Visibility属性为Hidden(隐藏);而在第21-22行判断出选择了“必填”单选按钮,此时设置显示“*”的TextBlock控件的Visibility属性为Visible(可见)。而我们如何获取显示“*”的TextBlock控件呢?在辅助方法GetTextBlockStar()中,我们通过Window的FindResource()方法来获取Key为setHeaderStyle的资源,然后再一步步地深入去找到显示“*”的TextBlock控件(这里就不一一说明了)。关于其他的辅助代码如下所示(这些代码就不一一分析)。
1 public class ViewModel 2 { 3 private MyCommand command; 4 public MyCommand Command 5 { 6 get { return command; } 7 set { command = value; } 8 } 9 10 public ViewModel() 11 { 12 command = new MyCommand(); 13 } 14 } 15 16 public class MyCommand : ICommand 17 { 18 public event Action<Object> ExecuteEvent; 19 20 public bool CanExecute(object parameter) 21 { 22 return ExecuteEvent != null; 23 } 24 25 public void Execute(Object parameter) 26 { 27 if (ExecuteEvent != null) 28 { 29 ExecuteEvent(parameter); 30 } 31 } 32 33 public event EventHandler CanExecuteChanged; 34 } 35 36 public enum OptionEnum 37 { 38 NoNeed, 39 Need 40 }
转载于:https://www.cnblogs.com/lienhua34/archive/2012/09/13/2684104.html
【小技巧积累】用Style实现必填提示“*”根据选项的不同而显示或隐藏相关推荐
- Flutter 10天高仿大厂App及小技巧积累总结
之前,也写过几篇关于 Flutter 的博文,最近,又花了一些时间学习研究 Flutter,完成了高仿大厂 App 项目 (项目使用的接口都是来自线上真实App抓包而来,可以做到和线上项目相同的效果) ...
- python小技巧积累--题库(持续更新)
介绍 作为一名程序员,除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键. python内置库中就有很多简洁而又优雅的操作,这里的知识都来源于网络积累, 闲暇时整理下来方便温故. 目录 > ...
- 【小技巧积累】设置ListView控件的Item不在Tab键导航序列中
在默认情况下,ListView控件的Item在Tab键导航序列中,就算我们将ListView控件的IsTabStop属性设置为False.而有些情况下,我们需要按Tab键时能跳过ListView控件. ...
- Word使用小技巧积累
(同样适用于WPS) Word中画横线方法:输入三个"-"."="然后回车: 也许这个技巧很多人都不知道,在Word中只要你连续输入三个"-" ...
- IOS 小技巧积累(持续更新)
1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法. 直接调用成员变量并且给其赋 ...
- FlashBuilder4的小技巧 代码自动完成 和 代码自动提示
1 使用空格或其他字符 完成代码输入 一般都是键入"." 开始提示代码, 但是我们可以设置其他的键盘字符更快的输入 进入 菜单"窗口"-> "首 ...
- 使用python调用minitab_Minitab小技巧: 解决Python错误的快速提示
会审视当前及过往的数据,以找出趋势并预测规律.发现变量之间隐藏的关系.可视化数据交互作用并识别重要因素,从而解答最棘手的问题.应对最严峻的难题. Minitab的Python连接功能允许用户从Mini ...
- Linux小技巧,取消cp、mv覆盖提示方法
Linux系统cp(复制).mv(移动)命令 在Linux系统中使用cp.mv命令时,若该文件存在,则会强制提示覆盖原文件,这样需要手动回车后才会复制.移动成功会很麻烦 解决方法: 方法一:修改配置文 ...
- 在微信小程序里,实现点击框里的眼睛图标时密码显示与隐藏切换
大家自己脑补一下,就是当你输入QQ密码时的一些展示和操作 具体看代码,亲测真机模拟有效(具体看GIF) 还有还有,一开始想的用type,但网上都说真机不成功,所以也就不试了,下面这种方法也是借鉴CSD ...
最新文章
- 洛谷 P1550 浇水
- 100 个网络基础知识,看完成半个网络高手
- mysql事物日志工具_MySQL——常用工具和日志
- 【135天】尚学堂高淇Java300集视频精华笔记(74-76)
- 洛谷——P1164 小A点菜
- leetcode —— 206. 反转链表
- signature=efaf25d07c6ea03d7552906c0caee5a8,幼児の認知発達における関係把握の問題
- rancher k8s docker 关系_CentOS7下利用Rancher搭建K8s集群
- 【MySQL】--数据库锁机制
- PX4固件飞行日志的采集设置以及数据读取
- 微信服务号添加小程序
- Arduino - Debugging on the Arduino IDE 2.0
- 本题要求计算给定的一系列正整数中奇数的和。
- MySQL数据库面试题(超详细)
- 【更新】本地提权工具公开|CVE-2020-0796:微软发布SMBv3协议“蠕虫级”漏洞补丁通告
- win10 远程桌面卡顿_win10远程桌面连接卡如何解决_windows10远程连接桌面很卡怎么处理...
- spoon java_如何以及为什么使用Spoon分析,生成和转换Java代码
- pycharm 使用matplotlib 绘图时图片不能显示中文
- 服务器提示临时文件已满,win10系统提示”由于临时文件夹已满而导致“磁盘空间不足”错误的解决办法_win10教程_uc电脑园...
- 不应发送ICMP差错报文的几种情况
热门文章
- ROC曲线与AUC以及LIFT
- linux php运行用户,Linux中普通用户如何以root身份运行命令
- 连锁百货企业数据系统整理解决方案
- windows下客户端连接上马上会断开连接_Tunneller VS DCOM,稳定性更高的连接!
- debug跳出循环_Java基础-第04章:循环结构「云图智联」
- libxml2如何配合php使用,libxml2实现xml文档的节点的修改
- 豆瓣电影 知识图谱 Neo4j
- pytorch学习笔记(十四):实战Kaggle比赛——房价预测
- [ubuntu 16.04]如何在新建的Anaconda环境中打开jupyter notebook
- leetcode693:Binary Number with Alternating Bits