2009-06-03 123 views
5

我有擴展選擇模式的簡單列表框。選擇工作幾乎完美,就像它在探險家中工作一樣。但取消選舉並不能真正奏效。我想要的是當我單擊列表框中元素範圍之外的某個元素時,我想要取消選擇所有元素。我似乎沒有默認行爲,我做了一個晦澀的黑客行爲,包括selectchanged和mouseup來破解它。但是必須有更好的方法。有任何想法嗎?取消選擇在WPF列表框與擴展選擇模式

回答

3

這不是髒在取消的功能添加,並且你在正確的軌道上。主要的問題是,默認情況下列表框裏面的ListBoxItems將跨越延伸一路,使得它非常艱難點擊一個。

這裏有一個例子是列表框修改默認ItemContainerStyle,這樣的項目只是佔用列表的左側,還有就是項目之間的一些間距爲好。

<ListBox SelectionMode="Extended" 
     Width="200" Mouse.MouseDown="ListBox_MouseDown"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Background" 
        Value="LightBlue" /> 
      <Setter Property="Margin" 
        Value="2" /> 
      <Setter Property="Padding" 
        Value="2" /> 
      <Setter Property="Width" 
        Value="100" /> 
      <Setter Property="HorizontalAlignment" 
        Value="Left" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBoxItem >Item 1</ListBoxItem> 
    <ListBoxItem >Item 2</ListBoxItem> 
    <ListBoxItem >Item 3</ListBoxItem> 
    <ListBoxItem >Item 4</ListBoxItem> 
</ListBox> 

要取消選擇的項目,我們只需要設置的SelectedItem爲空的事件處理程序。當我們點擊一​​個ListBoxItem時,它將處理MouseDown/Click等設置SelectedItem或修改SelectedItems。正因爲如此,RoutedEvents的本質我們只是在我們想要的時候處理ListBox中的MouseDown。當ListBox內的某個地方被點擊時,它不是一個項目的一部分。

private void ListBox_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    (sender as ListBox).SelectedItem = null; 
} 
+0

謝謝,但有點幫助,但我看到兩個問題。首先它沒有考慮到你有兩個列表框並且你想取消兩個列表框的情況。其次它似乎只取消選擇一個項目。 – 2009-06-04 08:11:25

3

我已經使用myListBox。 SelectedItems.Clear()。大多數選擇的項目集合是隻讀的,但不是列表框。

相關問題