2011-03-31 58 views
0

如何更改ListBox和ListView選擇規則的方式與WinForms相同?在WPF中,如何像WinForms一樣更改ListBox和ListView選擇規則?

在WPF中,如果已經將項目ListBox中/的ListView選擇列表中甚至空白區域被點擊,選擇仍然存在。 在WinForm/MFC中,單擊空白區域時將取消選擇該選擇。

這是非常有用,尤其是實施明智的。

例如,當用戶在列表框中雙擊一個項目時,最好的行爲如下: - 如果用戶雙擊一個項目,修改該項目是快捷方式,因此將打開配置對話框。 - 如果用戶雙擊一個空的是,它的快捷方式添加一個新的項目,所以文件選擇對話框將被打開。

要實現這一行爲,使用匹配測試,以找出單擊項目將是可取的。 但是,由於WPF中的命中測試與WinForm, 相比並不那麼容易,最簡單的方法就是隻要用戶雙擊列表就檢查選定的項目。

它的工作申請是由WinForm的/ MFC做,但不是因爲列表項選擇的行爲差異的WPF。

有什麼辦法來改變列表項選擇以同樣的方式的WinForm/MFC? 或者,我應該選擇不同的方式來實現上述行爲?

回答

1

以下列表框樣本區分項目和列表框的雙擊。

XAML:

<Window x:Class="ListBoxTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <ListBox 
     ItemsSource="{Binding Path=Data}" 
     MouseDoubleClick="OnListBoxMouseDoubleClick"> 
     <ListBox.Resources> 
      <Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}"> 
       <EventSetter Event="PreviewMouseDoubleClick" Handler="OnItemPreviewMouseDoubleClick" /> 
      </Style> 
     </ListBox.Resources> 
    </ListBox> 

</Window> 

後面的代碼:

using System; 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 

namespace ListBoxTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      Data = new List<string>() { "AAA", "BBB", "CCC" }; 
      DataContext = this; 
     } 

     public List<string> Data { get; private set; } 

     private void OnListBoxMouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      MessageBox.Show("Add new item"); 
     } 

     private void OnItemPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      string content = (sender as ListBoxItem).Content as string; 
      MessageBox.Show("Edit " + content); 
     } 
    } 
} 
+0

呵呵,爽!這是一個完美的解決方案。 = D非常感謝! – Aki24x 2011-03-31 16:52:57