如何像WinForms一样更改ListBox和ListView选择规则?
在WPF中,如果已经在ListBox / ListView中选择了一个项目,则即使单击列表的空白区域,仍会保留选择。 在WinForm / MFC中,单击空白区域时将取消选择。
这对于实施而言非常有用。
例如,当用户双击ListBox中的某个项目时,其中一个更好的行为是: - 如果用户双击某个项目,则修改该项目是快捷方式,因此将打开配置对话框。 - 如果用户双击空白,则添加新项目是快捷方式,因此将打开文件选择对话框。
要实现此行为,最好使用命中测试来查找单击的项目。 但是,由于WPF中的命中测试与WinForm相比并不那么容易使用, 最简单的方法是只要用户双击List就检查所选项目。
由于列表项选择的行为差异,应用程序由WinForm / MFC制作,但不是WPF。
有没有办法将列表项选择更改为与WinForm / MFC相同的方式? 或者,我应该选择不同的方式来实现上述行为吗?
答案 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);
}
}
}