WPF Bug清单之(10)——CheckBox在不同主题下具有不同的行为

我们都知道Window有多种主题(Theme)。一般情况下,显然我们会希望不同 主题下,我们的应用程序的行为不会有变化。或者说,我们不希望为了特定的主 题,为控件写特定的逻辑。然而不幸的是,.NET Framework里一些控件自带的主 题就存在问题,使得我们不得不在使用时,为这个控件在特定的主题下特殊处理 。

下面举一个例子。在 ListBox里放CheckBox,组成一个CheckBoxList应该是 一个比较常见的应用。从理论上来说,在WPF里最简单的方式就是在 ListBox的 ItemTemplate里或是ItemContainerStyle里放一个CheckBox就可以了。

但是实际上,在做这个简单的CheckBoxList的时候,会遇到一个又一个的问 题。首先重申一下文本的意图,怕自己又没有说明白误导大家。

本文不是讨论

CheckBoxList

里的蓝条问题,而是在讨论CheckBox

在不同主题下的不同行为的问题。CheckBoxList

仅仅是个例子。

先来看看效果图。

图1. 两种主题下的CheckBox

在上图中,左侧是Classic主题下的CheckBox。右侧是XP默认的Luna主题下的 CheckBox。

问题1. CheckBox的IsChecked状态与ListBoxItem的IsSelected状态不同步。 如果你想保留选中时的蓝条,那么比较好办,把这两个属性Binding到一起就可 以了。如果你不想要那个选中时的蓝条,会稍稍复杂一些。解决方案很多,就不 赘述了。示例程序中,为减少干扰,不对这个问题进行解决。

问题2. CheckBox所在的Item被选中时,为蓝色。CheckBox里的文字为黑色, 这个与ListBoxItem的默认颜色行为不一致。为了让 CheckBox在被选中时文字为 白色并不难,写个Binding就OK了。这个根本不是问题,但是解决这个问题,造 成了下面的问题,才是主要问题。(当然,如果你隐藏了蓝条,就没有任何问题 。)

问题3. 这个是这篇文章的主要议题,看看下面几个图就知道了。我们对两边 的CheckBoxList做同样的操作。先来右边的。

图2. 选中最后一个CheckBox

图3. 点击刚才选中CheckBox边上的空白,使其选中

时间: 2024-10-31 09:59:40

WPF Bug清单之(10)——CheckBox在不同主题下具有不同的行为的相关文章

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清单之(4)——点击RadioButton的空白没有反应

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

WPF Bug清单之(12)

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

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的重现过程如

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清单之(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中的ErrorTemp

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里都有的查