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实现必填提示“*”根据选项的不同而显示或隐藏相关推荐

  1. Flutter 10天高仿大厂App及小技巧积累总结

    之前,也写过几篇关于 Flutter 的博文,最近,又花了一些时间学习研究 Flutter,完成了高仿大厂 App 项目 (项目使用的接口都是来自线上真实App抓包而来,可以做到和线上项目相同的效果) ...

  2. python小技巧积累--题库(持续更新)

    介绍 作为一名程序员,除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键. python内置库中就有很多简洁而又优雅的操作,这里的知识都来源于网络积累, 闲暇时整理下来方便温故. 目录 > ...

  3. 【小技巧积累】设置ListView控件的Item不在Tab键导航序列中

    在默认情况下,ListView控件的Item在Tab键导航序列中,就算我们将ListView控件的IsTabStop属性设置为False.而有些情况下,我们需要按Tab键时能跳过ListView控件. ...

  4. Word使用小技巧积累

    (同样适用于WPS) Word中画横线方法:输入三个"-"."="然后回车: 也许这个技巧很多人都不知道,在Word中只要你连续输入三个"-" ...

  5. IOS 小技巧积累(持续更新)

    1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法. 直接调用成员变量并且给其赋 ...

  6. FlashBuilder4的小技巧 代码自动完成 和 代码自动提示

    1 使用空格或其他字符 完成代码输入 一般都是键入"." 开始提示代码, 但是我们可以设置其他的键盘字符更快的输入 进入 菜单"窗口"-> "首 ...

  7. 使用python调用minitab_Minitab小技巧: 解决Python错误的快速提示

    会审视当前及过往的数据,以找出趋势并预测规律.发现变量之间隐藏的关系.可视化数据交互作用并识别重要因素,从而解答最棘手的问题.应对最严峻的难题. Minitab的Python连接功能允许用户从Mini ...

  8. Linux小技巧,取消cp、mv覆盖提示方法

    Linux系统cp(复制).mv(移动)命令 在Linux系统中使用cp.mv命令时,若该文件存在,则会强制提示覆盖原文件,这样需要手动回车后才会复制.移动成功会很麻烦 解决方法: 方法一:修改配置文 ...

  9. 在微信小程序里,实现点击框里的眼睛图标时密码显示与隐藏切换

    大家自己脑补一下,就是当你输入QQ密码时的一些展示和操作 具体看代码,亲测真机模拟有效(具体看GIF) 还有还有,一开始想的用type,但网上都说真机不成功,所以也就不试了,下面这种方法也是借鉴CSD ...

最新文章

  1. 洛谷 P1550 浇水
  2. 100 个网络基础知识,看完成半个网络高手
  3. mysql事物日志工具_MySQL——常用工具和日志
  4. 【135天】尚学堂高淇Java300集视频精华笔记(74-76)
  5. 洛谷——P1164 小A点菜
  6. leetcode —— 206. 反转链表
  7. signature=efaf25d07c6ea03d7552906c0caee5a8,幼児の認知発達における関係把握の問題
  8. rancher k8s docker 关系_CentOS7下利用Rancher搭建K8s集群
  9. 【MySQL】--数据库锁机制
  10. PX4固件飞行日志的采集设置以及数据读取
  11. 微信服务号添加小程序
  12. Arduino - Debugging on the Arduino IDE 2.0
  13. 本题要求计算给定的一系列正整数中奇数的和。
  14. MySQL数据库面试题(超详细)
  15. 【更新】本地提权工具公开|CVE-2020-0796:微软发布SMBv3协议“蠕虫级”漏洞补丁通告
  16. win10 远程桌面卡顿_win10远程桌面连接卡如何解决_windows10远程连接桌面很卡怎么处理...
  17. spoon java_如何以及为什么使用Spoon分析,生成和转换Java代码
  18. pycharm 使用matplotlib 绘图时图片不能显示中文
  19. 服务器提示临时文件已满,win10系统提示”由于临时文件夹已满而导致“磁盘空间不足”错误的解决办法_win10教程_uc电脑园...
  20. 不应发送ICMP差错报文的几种情况

热门文章

  1. ROC曲线与AUC以及LIFT
  2. linux php运行用户,Linux中普通用户如何以root身份运行命令
  3. 连锁百货企业数据系统整理解决方案
  4. windows下客户端连接上马上会断开连接_Tunneller VS DCOM,稳定性更高的连接!
  5. debug跳出循环_Java基础-第04章:循环结构「云图智联」
  6. libxml2如何配合php使用,libxml2实现xml文档的节点的修改
  7. 豆瓣电影 知识图谱 Neo4j
  8. pytorch学习笔记(十四):实战Kaggle比赛——房价预测
  9. [ubuntu 16.04]如何在新建的Anaconda环境中打开jupyter notebook
  10. leetcode693:Binary Number with Alternating Bits