在WPF BUG清單之二,介紹過RadioButton在綁定上的一個Bug。現在再來介紹它的另一個造成RadioButton的點擊事件處理不正確的BUG。現象是:點在RadioButton的范圍內,可這個RadioButton就是選不中。
先來看一個例子。Windows裡一個常見的對話框,用了多個RadioButton。如下圖所示。
圖1.RadioButton使用范例
把RadioButton放在GroupBox的Header上,是很常見的一個用例,而且被微軟的UX Guide所認可。
大家可以在自己的電腦上點點這些RadioButton,只要點在圓圈或文字范圍內,就會被選中。
我們現在用WPF來實現這個效果。實現的方式有很多。
1.直接在Header裡放一個RadioButton。簡單,不可復用。
2.使用HeaderTemplate,裡面放個RadioButton。比上面的復雜些,結果一樣。
3.使用ControlTemplate,還是裡面放個RadioButton。復用性好些。
簡單起見,我們用第一種方式來演示這個Bug。
Sample code
<StackPanel Margin="12">
<TextBlock Margin="0,0,0,5" TextWrapping="Wrap">
<Run FontWeight="Bold">Bug Description:</Run>
<Run>略</Run>
</TextBlock>
<GroupBox Padding="9" >
<GroupBox.Header>
<RadioButton Content="Header RadioButton" GroupName="header"/>
</GroupBox.Header>
<GroupBox.Content>
<StackPanel>
<RadioButton Content="Common RadioButton"/>
<RadioButton Content="Common RadioButton"/>
</StackPanel>
</GroupBox.Content>
</GroupBox>
<GroupBox Padding="9" >
<GroupBox.Header>
<RadioButton Content="Header RadioButton" GroupName="header"/>
</GroupBox.Header>
<GroupBox.Content>
<StackPanel>
<RadioButton Content="Common RadioButton"/>
<RadioButton Content="Common RadioButton"/>
</StackPanel>
</GroupBox.Content>
</GroupBox>
</StackPanel>
運行的效果如下圖。
圖2.RadioButton點擊Bug示例
PS:本來想做個XBAP程序放上來讓大家直接點點。結果沒找著上傳.exe的地方。
這個BUG的根源應該是由於顏色造成的。可以發現鼠標在Header RadioButton上移動時,只有鼠標處在有顏色區域的上方時,RadioButton才認為自己是MouseOver。但是特意給RadioButton的Header設置了Background之後,問題依舊。
這個問題讓我們的QA和Developer同時抓狂不已。作為高品質的軟件,這種看上去的小問題也是不可容忍的。解決方式是有的,但是丑惡得不敢拿出來給大家看。還是等神人出場或是.NET Framework 4.0吧。
-----------------------------------------總結的分割線---------------------------------------
RadioButton目前已有兩個BUG入帳,榮登WPF BUG榜第一。但是RadioButton同學也不要高興得太早,我們的BUG主力ListBox以其義兄ListView還沒發威呢。Button同學就放棄吧,作為最簡單的控件之一,也得給我們點兒信心啊。