在WPF中,如何以与WinForms相同的方式更改ListBox和ListView选择规则?

时间:2011-03-31 02:57:25

标签: wpf listview listbox selection

如何像WinForms一样更改ListBox和ListView选择规则?

在WPF中,如果已经在ListBox / ListView中选择了一个项目,则即使单击列表的空白区域,仍会保留选择。 在WinForm / MFC中,单击空白区域时将取消选择。

这对于实施而言非常有用。

例如,当用户双击ListBox中的某个项目时,其中一个更好的行为是: - 如果用户双击某个项目,则修改该项目是快捷方式,因此将打开配置对话框。 - 如果用户双击空白,则添加新项目是快捷方式,因此将打开文件选择对话框。

要实现此行为,最好使用命中测试来查找单击的项目。 但是,由于WPF中的命中测试与WinForm相比并不那么容易使用, 最简单的方法是只要用户双击List就检查所选项目。

由于列表项选择的行为差异,应用程序由WinForm / MFC制作,但不是WPF。

有没有办法将列表项选择更改为与WinForm / MFC相同的方式? 或者,我应该选择不同的方式来实现上述行为吗?

1 个答案:

答案 0 :(得分: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);
        }
    }
}