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一样)

先举个最简单的BUG。WPF中ListBox选中项BUG。

1<Window x:Class="ListBoxSelectionBug.DemoWindow"
2  xmlns=""
3  xmlns:x=""
4  xmlns:sys="clr-namespace:System;assembly=mscorlib"
5  xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
6  Title="ListBox Selection Bug Demo" Height="300" Width="300">
7  <DockPanel Margin="12">
8    <Label Content="随便点点,他们可应该都是单选的哦。"
9        DockPanel.Dock="Top"/>
10    <GroupBox Header="WPF ListBox"
11         DockPanel.Dock="Top"
12         Padding="9" Margin="0,0,0,12">
13      <ListBox SelectionMode="Single">
14        <sys:String>A string value</sys:String>
15        <sys:String>A string value</sys:String>
16        <sys:String>A string value</sys:String>
17      </ListBox>
18    </GroupBox>
19    <GroupBox Header="Forms ListBox" Padding="9">
20      <WindowsFormsHost>
21        <forms:ListBox>
22          <forms:ListBox.Items>
23            <sys:String>A string</sys:String>
24            <sys:String>A string</sys:String>
25            <sys:String>A string</sys:String>
26          </forms:ListBox.Items>
27        </forms:ListBox>
28      </WindowsFormsHost>
29    </GroupBox>
30  </DockPanel>
31</Window>
32

上面的源代码中同时列出了WPF的ListBox和WinForm的ListBox作为对比。注意在WPF的ListBox上可是特意标示出它是一个单选列表框了哦。但是结果却是这个样子。

图1. WPF ListBox Selection Bug

都是在ListBox里直接放几个String类型的值。结果WPF ListBox把几个值一样的string当成了同一个string,还变成了一个MultiSelection的ListBox。

从.NET 3.0等到了.NET 3.5 SP1,这个BUG依然怡然自得地躺在WPF里。不知道是不是微软不认为这是一个BUG?

PS:请不要建议在ListBox里放ListBoxItem来逃避这个问题。

在后面的几篇里,将会继续为大家揭露一些WPF的BUG或是不便(基本上各个控件都有份哦。),更欢迎大家来补充自己发现的BUG,毕竟一个人的见识有限。希望能给大家一些提示。

时间: 2024-09-30 10:06:42

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

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清单之(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清单之(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清单之(13)——应该出现却没有出现的ListView水平滚动条

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

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

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

WPF Bug清单之(9)——消失的光标

首先声明一下:有人早就发现了这个问题,发过了帖子,也已经有微软的人说这是"by design"的行为.但是我依然对这个诡异的行为表示不可理解.所以发上来,看看大家的见解. 示例代码非常之简单. <Window x:Class="HiddenCaret.DemoWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http