[WPF疑难]ErrorTemplate显示与隐藏问题
                                        周银辉
1,问题描述:

在为Binding提供验证模板时,我们需要使用一个ControlTemplate来为验证控件提供验证反馈,即是当验证失败时在被验证控件的旁边或外围提供一个具有明显视觉效果的UI元素以提醒用户(一个普遍的做法,比如文本框外围出现一个红色线框),这也就是传说中的Validation.ErrorTemplate。按照正常人的思维:ErrorTemplate(红色线框)的可见性应该随着被验证控件(文本框)的可见性的改变而动态改变。但目前事实并非如此,即便是用WPF默认的ErrorTemplate。这让人很抓狂,在用户看来这将是一个可笑而又弱智的错误。

让用户输入点什么:

出错了,显示一个红线框以提醒:

点击Expander将文本框隐藏起来,当红线框依然存在:

2,解决方案

2.1 思路
先看看我们的ErrorTemplate是如何编写的:
        <ControlTemplate x:Key="validationTemplate">
            <Border BorderBrush="Red"
                    BorderThickness="2" >
                <AdornedElementPlaceholder x:Name="holder" />
            </Border>
        </ControlTemplate>
其中AdornedElementPlaceholder 是一个占位符,表示修饰控件相对于ControlTemplate中其它元素所放置的位置(这个示例中用于文本框的占位),而Border则是我们的红线框。那么很自然地(这让我想起中学数学中的”同理可证、所以、显然“)我们可以将Border 的可见性与AdornedElementPlaceholder.AdornedElement(这里是我们文本框) 的可见性Binding起来而解决这个问题,的确如此

2.2 容易写出的错误代码:
        <ControlTemplate x:Key="validationTemplate">
            <Border BorderBrush="Red"
                    BorderThickness="2"
                    Visibility="{Binding ElementName=holder,Path=AdornedElement.Visibility} >
                <AdornedElementPlaceholder x:Name="holder" />
            </Border>
        </ControlTemplate>
错误的原因是,Visiblity属性是不能向下传递的。意思是说:假设一个grid中包含一个textBox,开始时两者均可见(Visibility == Visibility.Visible),当将grid.Visibility设置为Hiden后其它时并不会影响textBox.Visibility,虽然textBox的确看不见了。

2.3 正确的方式:
事实上你应该根据UIElement.IsVisible属性来检测元素是否可见(只读属性),通过UIElement.Visibility 来设置元素的可见性。(虽然这让人感觉如此之混乱)

<BooleanToVisibilityConverter x:Key="bvConverter" />

<ControlTemplate x:Key="validationTemplate">
            <Border BorderBrush="Red"
                    BorderThickness="2"
                    Visibility="{Binding ElementName=holder,Path=AdornedElement.IsVisible, Converter={StaticResource bvConverter}}">
                <AdornedElementPlaceholder x:Name="holder" />
            </Border>
        </ControlTemplate>

Done!

转载于:https://www.cnblogs.com/zhouyinhui/archive/2008/05/26/1207409.html

[WPF疑难]ErrorTemplate显示与隐藏问题相关推荐

  1. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  2. 【C#】WPF和winform窗体贴边隐藏(类似QQ)

    [WPF]实现窗体贴边隐藏 1.新建WPF项目Test,主窗体MainWindow.xaml,在后台MainWindow.xaml.cs填写下面的代码.主窗体调用Hide类,实现隐藏功能. //有些引 ...

  3. android应用去掉状态栏_Android 显示、隐藏状态栏和导航栏

    Android 显示.隐藏状态栏和导航栏 控制状态栏显示,Activity的主题中配置全屏属性 true 控制状态栏显示,在setContentView之前设置全屏的flag getWindow(). ...

  4. react控制组件的显示或隐藏, 根据state判断元素显示隐藏 , setState不实时生效解决方法

    代码实现功能:根据 state 中的值判断子组件显示或隐藏,因为 setState 不是及时生效的,所以不做显示隐藏判断会报错. render() {// 客户经理循环组件function Comme ...

  5. [WPF疑难]避免窗口最大化时遮盖任务栏

    [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后(比如很多情况下你会覆盖默认的窗体样式,即不采用W ...

  6. jQuery动画的显示与隐藏效果

    jQuery中用于控制元素显示和隐藏效果的方法如表1所示. 表1 控制元素的显示和隐藏 在表1中,参数speed表示动画的速度,可设置为动画时长的毫秒值(如1000),或预定的3种速度(slow.fa ...

  7. 【特效】移入显示移出隐藏

    移入显示移出隐藏的效果也是很常见的,例如: 如果页面有有多处地方有此效果,那么也可以合并到一块,只写一段js代码,只要注意控制样式和class名字和用于js获取元素的class名字分开设置就可以了.代 ...

  8. 19元素的显示与隐藏

    类似网站广告,当我们点击关闭就不见了.但是,当我们重新刷新页面时,广告又会重新出现! 本质:让一个元素在页面中隐藏或显示出来! 1.三种显示与隐藏方式 display显示隐藏 visibility显示 ...

  9. jQuery判断当前元素显示状态并控制元素的显示与隐藏

    1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible');   //true为显示,false为隐藏 $("#id") ...

最新文章

  1. Save a tree as XML using XmlSerializer
  2. To connect to files.phpmyadmin.net insecurely, use `--no-check-certificate‘
  3. Java 到底是值传递还是引用传递
  4. Mysql访问新数据时先查表
  5. 软件设计模式六大原则之四接口隔离原则(PHP语言实现)
  6. MySQL的事务与事务隔离
  7. Python~win32com~Excel
  8. 好看的导航网站源码-简约自适应网站网址导航系统
  9. Sklearn之datasets和训练
  10. python scikit_Python SciKit学习教程
  11. arttemplate模板引擎里面多层循环
  12. css 超过长度省略
  13. 微信小程序sass不编译怎么办_不吹牛,四款免费实用的微信小程序,打开立即使用!...
  14. 启动多个SlickEdit实例
  15. linux删除回收站提示权限错误
  16. win10系统安装jdk8简易教程
  17. python抓取豆瓣电影
  18. 懒人教你用猕猴桃一月饱减16斤_过路老熊_新浪博客
  19. python计算机视觉编程——基本的图像操作和处理
  20. 斐讯路由器怎样设置虚拟服务器,斐讯路由器怎么设置_p.to路由器设置界面-WIFI之家...

热门文章

  1. Android 启动分析 1
  2. IELE:区块链的一个新虚拟机
  3. 关于intent-filter的误区
  4. 微信自动回复和自动抢红包实现原理(三):自动抢红包
  5. AndroidL的checkPermission方法详解
  6. mob sdk vue 短信验证_短信接口那些事儿,你知道多少?
  7. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
  8. oracle 数据库问题,ORACLE数据库常见问题汇总,oracle常见问题汇总
  9. for of 的用法区别_语法全解介词to和for的用法 如何简单区别使用
  10. 2017年9月2日普级组T1 正方形