posts - 57,  comments - 191,  trackbacks - 21

.NET 3.0发布至今,.NET Framework相继发布了.NET 3.5.NET3.5 SP1。其间做了两个基于WPF的项目。发现现在的WPFBUG真的是不算少。给程序的开发带来了不少的困扰——为了避开BUG,而不得不多写很多代码。

 

这个“WPF BUG清单”系列,将列出笔者在项目中遇到过的WPF的各种问题,也许不一定是BUG,但是会造成开发上的不便。更感觉WPF的第一次发布实在有赶鸭子上架的嫌疑。很多东西都还没有做就发布了。(跟Silverlight 1.0一样)

 

先举个最简单的BUGWPFListBox选中项BUG

 1<Window x:Class="ListBoxSelectionBug.DemoWindow"
 2    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 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

 

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

 

1. WPF ListBox Selection Bug

 

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

 

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

 

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

 

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

下面是一部分计划。(实际顺序可能有不同。)

 

[WPF Bug清单](2)——RadioButtonIsChecked绑定失效

[WPF Bug清单](3)——暗中创建文件的打开文件对话框

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

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

[WPF Bug清单](6)——ButtonIsCancel属性失效

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

[WPF Bug清单](8)——RowDefinitionMaxHeight在一定条件下失效

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

 

……

Tag标签: WPF
posted on 2008-12-13 13:46 南柯之石 阅读(1298) 评论(12)  编辑 收藏 网摘

FeedBack:
2008-12-13 14:29 | Muse      
我不能说它不是一个BUG,但是:
“请不要建议在ListBox里放ListBoxItem来逃避这个问题”
你在Form.ListBox里面说明这是“forms:ListBox.Items”,却不许WPF里面用ListBoxItem,是不是有点不公平呢?
另外,如果把
14 A string value
15 A string value
16 A string value
改成
14 A string value1
15 A string value2
16 A string value3
就完全正常了。
我觉得跟字符串的特殊处理方式有关系。

  回复  引用  查看    
#2楼[楼主]
2008-12-13 14:41 | 南柯之石      
@Muse
建议你先去看看WPF里XAML的语法。
第一,forms:ListBox.Items里放的也不是ListBoxItem。他们是公平的。
第二,WPF的ListBox具有[ContentProperty("Items")],所以下面的两种写法是完全一样的。
<ListBox SelectionMode="Single">
<ListBox.Items>
<sys:String>A string value</sys:String>
<sys:String>A string value</sys:String>
<sys:String>A string value</sys:String>
</ListBox.Items>
</ListBox>

<ListBox SelectionMode="Single">
<sys:String>A string value</sys:String>
<sys:String>A string value</sys:String>
<sys:String>A string value</sys:String>
</ListBox>

我指的不要用ListBoxItem是指不要用这样的方式

<ListBox SelectionMode="Single">
<ListBoxItem Content="A string value"/>
<ListBoxItem Content="A string value"/>
<ListBoxItem Content="A string value"/>
</ListBox>

因为这样写会给数据绑定带来麻烦。

也怪我在原文里没有解释清楚。见谅哈。


  回复  引用  查看    
#3楼[楼主]
2008-12-13 14:44 | 南柯之石      
@Muse
再次谢谢你的补充。
我在原文中已经提到了。“结果WPF ListBox把几个值一样的string当成了同一个string”
Bug产生的条件就是要有值相同的几个string。

  回复  引用  查看    
2008-12-13 16:48 | deerchao      
这个很难说是bug吧..
  回复  引用  查看    
2008-12-13 17:49 | ###123###[未注册用户]
这确实是个BUG,不过他造成的问题不是单选失效,实际上你可以通过SelectedItems属性看出,他仍然是单选,只是无论你怎样选择,他都只能选定ListBox中的第一个与你选定项一样的项,而不是你选定的那个项,这个可以通过SelectedIndex看出。在楼主的列子中,无论你选定的是第二个还是第三个,程序都是选定第一个,因为SelectedIndex始终为0,不过对于相同的字符串来说一般这个问题不大。其实这个BUG最大的问题是界面绘制有极大的问题,给人一种多选的视觉感受。
  回复  引用    
2008-12-13 19:48 | 银河      
赞成楼主的观点。这的确是一个 BUG。
楼主有向微软公司反馈了吗?

  回复  引用  查看    
#7楼[楼主]
2008-12-13 20:24 | 南柯之石      
@###123###
@银河
多谢支持和补充。
还没有向微软报过这个BUG。以为这种明显的BUG(不过就是给ListBox加几个相同的String而已)微软应该会在“下一次”Release中修正。结果“下一次”一直没有出现。-_-

  回复  引用  查看    
2008-12-14 00:25 | Muse      
尽管对实际编程影响不大,不过还是给微软反馈一下吧,一般情况下却是很少见在XAML中写同样的字符串(不应该出现这种需求),所以估计也没有这样的测试用例。

等着看你更多的Bug,我们都学习一下,也免得走弯路。

  回复  引用  查看    
#9楼[楼主]
2008-12-14 00:30 | 南柯之石      
@Muse
谢谢你。
这个的确不太常见。一般都是放Business Object,而不会直接放string,就不会出现这样的问题了。

  回复  引用  查看    
2008-12-15 10:17 | chujun[未注册用户]
用ListBoxItem就可以了
  回复  引用    
2008-12-16 13:06 | dark_arthur      
恩。。。 是bug~
  回复  引用  查看    
2009-01-12 09:48 | 智者千虑      
ListBox比较项是否相同时调用的是Equals方法
  回复  引用  查看    
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1354226 UYDOJpTxDNo=



相关文章:

相关链接:
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

本人保留本博客所有文章版权,未经得本人同意的转载,必须在明显位置注明文章出处及作者,否则视为侵权。

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔档案(55)

文章档案(3)

积分与排名

  • 积分 - 38587
  • 排名 - 1569

最新评论

阅读排行榜

评论排行榜

60天内阅读排行