WPF Bug清单之(7)——顽固的Error Template

关于WPF数据绑定是什么,请参考Data Binding Overview:http://msdn.microsoft.com/en-us/library/ms752347.aspx

关于WPF数据绑定的Validation更多细节,请参考Data Validation in 3.5:http://blogs.msdn.com/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx

关于WPF数据绑定的Validation中的ErrorTemplate怎么用,请参考ErrorTemplate Attached Property:http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx

ErrorTemplate将被绘制在Adorner Layer上,关于Adorner Layer,请参考Adorners Overview:http://msdn.microsoft.com/en-us/library/ms743737.aspx

在Adorners Overview里,对Adorner是这样解释的,

Adorners are rendered in an AdornerLayer, which is a rendering surface that is always on top of the adorned element or a collection of adorned elements.

Adorned element的红色是我加的。表面上看,这个adorned element就是一个element,但是这个element的范围有多大呢?对我们的程序会有什么影响呢?看文档很难想到。用过之后才知道,影响太大了。

还有这样一个不太起眼的Note。

Anything placed in the adorner layer is rendered on top of the rest of any styles you have set. In other words, adorners are always visually on top and cannot be overridden using z-order.

这句话是对的。大意就是说这个Adorner layer里的东西,总会被绘制在它所adorn的东西之上。这个无可厚非,人家这样设计,我们就这么用就是了。但是,问题就在于,一个Window里的东西,是可以有层次的,有区域,有可见性的。但是adorner layer不分青红皂白地总在最上。结果就出了问题。请看下面的例子。

DemoWindow

<Window x:Class="FixErrorTemplate.DemoWindow"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    Title="Stubborn Error Template Demo"    Height="200" Width="300"    ResizeMode="NoResize"    WindowStartupLocation="CenterScreen"    Name="window">    <Grid>        <Grid.RowDefinitions>            <RowDefinition Height="50"/>            <RowDefinition Height="5"/>            <RowDefinition/>        </Grid.RowDefinitions>        <Grid Height="50">            <TextBox HorizontalAlignment="Center" VerticalAlignment="Center" Width="100">                <TextBox.Text>                    <Binding ValidatesOnDataErrors="True" ElementName="window" Path="Value"/>                </TextBox.Text>            </TextBox>        </Grid>        <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch"/>        <Grid Grid.Row="2" Margin="12">            <TabControl>                <TabItem Header="Tab1">                    <TextBox HorizontalAlignment="Center" VerticalAlignment="Center" Width="100">                        <TextBox.Text>                            <Binding ValidatesOnDataErrors="True" ElementName="window" Path="Value"/>                        </TextBox.Text>                    </TextBox>                </TabItem>                <TabItem Header="Tab2"/>            </TabControl>        </Grid>    </Grid></Window>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索validation
, element
, microsoft
, wpf style template
, 关于
, Overview
参考
wpf controltemplate、wpf datatemplate、wpf template、wpf templatebinding、wpf style template,以便于您获取更多的相关知识。

时间: 2016-01-25

WPF Bug清单之(7)——顽固的Error Template的相关文章

WPF Bug清单之(4)——点击RadioButton的空白没有反应

在WPF BUG清单之二,介绍过RadioButton在绑定上的一个Bug.现在再来介绍它的另一个造成RadioButton的点击事件处理不正确的BUG.现象是:点在RadioButton的范围内,可这个RadioButton就是选不中. 先来看一个例子.Windows里一个常见的对话框,用了多个RadioButton.如下图所示. 图1.RadioButton使用范例 把RadioButton放在GroupBox的Header上,是很常见的一个用例,而且被微软的UX Guide所认可. 大家可

WPF Bug清单(序)与之(1)——可以多选的单选ListBox

从.NET 3.0发布至今,.NET Framework相继发布了.NET 3.5和.NET3.5 SP1.其间做了两个基于WPF的项目.发现现在的WPF的BUG真的是不算少.给程序的开发带来了不少的困扰--为了避开BUG,而不得不多写很多代码. 这个"WPF BUG清单"系列,将列出笔者在项目中遇到过的WPF的各种问题,也许不一定是BUG,但是会造成开发上的不便.更感觉WPF的第一次发布实在有赶鸭子上架的嫌疑.很多东西都还没有做就发布了.(跟Silverlight 1.0一样) 先举

WPF Bug清单之(12)

WPF Bug清单之(12)--与自定义Attached Property相关的Binding Path运行时错误 我们都知道DataBinding的格式是这样的: {Binding Path=PropertyName} 其中的Path=这几个字是可以省略的.从而简写成: {Binding PropertyName} 这个行为也在MSDN上面特别介绍过. 本文所指"解析错误"是指:当Property是自定义的AttachedProperty时, 第二种写法会产生运行时错误.如下代码所示

WPF Bug清单之(8)——RowDefinition中MaxHeight在一定条件下失效

再下一城. BUG描述:当RowDefinition的Height属性被设置为Auto时,MaxHeight将不会对这个Row的Height起到限制作用. Bug发现过程:想做一个像Visual Studio 2008里Error List一样的东西.平时自动占用最小的空间,可以在适当的时候自己弹出来,但是又不要弹得过高. 示例窗口代码如下: Demo Window <Window x:Class="InvaliMaxHeight.DemoWindow" xmlns="

WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条

我们知道ListView在内容超出控件本身范围时,默认会把滚动条显示出来. 这个内容,显然应该包括Head和Items两个部分.无论哪个部分超出了,都应该 把水平滚动条显示出来. ListView的Bug就在于,当ListView中没有Item,且Headr的总长超过 ListView本身时,水平滚动条没有出现. 这个Bug很好重现.代码如下: <Grid x:Name="LayoutRoot"> <ListView Width="100">

WPF Bug清单之(6)——Button的IsCancel属性失效

在上一篇中,描述了模态对话框隐藏之后变成了非模态的Bug,很多人回复表示这不算是一个Bug,我也表示理解.Bug只有在需求之下才有意义,不同的需求,对Bug的界定也不一样.作为一个Framework,.NET只能做到在多数时候是符合最广泛群体的需求的,就可以说它合格.但是对于前一篇描述的问题,想补充一下自己的考虑. Window的Show和ShowDialog,用于将窗体展现(我没有用显示)出来,而Close用于关闭.Close之后就不能再用Show或是ShowDialog再次将窗体展现出来,否

WPF Bug清单之(5)——隐藏模态对话框后变成非模态

发现这个问题时,隐约记得之前有人已经发过这个问题,想把链接放到这里,不过找了半天,实在找不到.日后如果找到了一定加上. 问题描述:用ShowDialog方法弹出一个模态对话框,然后将此对话框的Visibility属性设置为Hidden,再设置回Visible,发现这个对话框已经不是模态的了. 有人会觉得关就关了得了,也不会有这个问题,干什么要把Close取消掉然后再显示出来呢?因为这是有应用环境的. 应用环境:有些对话框,从逻辑上就是单例的,比如Office和Visual Studio里都有的查

WPF Bug清单之(2)——RadioButton的IsChecked绑定失效

.NET Framework已经算是一个很易用的库了.可以自动地为我们做很多事情,而且大都做得还不错.但是自动完成的事情很可能会有隐患,因为Framework本身是并不了解业务逻辑的.它自动完成的事情,可能会给我们帮倒忙. RadioButton就是其中一个. 先来从设置值的角度介绍一下WPF里的Dependency Property(以下简称DP).在WPF里控制一个控件的DP,有太多的方式.可以用Style,可以用Animation,可以用Data Binding,可以用Trigger,还有

WPF Bug清单之(11)——错位的RenderTransform动画

在WPF中制作位移类动画大致有3种方式,Margin.RenderTransform和 LayoutTransform.虽然3者的效果略有不同,但是不少情况下3种方式可以通用 .但是当你了解到RenderTransform所存在的Bug时,可能就需要考虑一番了. 我们都知道很多控件都有FocusVisualStyle,一般就是一个虚线框. RenderTransform的问题就在于, 控件的FocusVisualStyle中的元素,不会随着 控件本身一起被Transform. Bug的重现过程如