要在WPF中获得ListView的选择行为以赶上WinForms,我需要做什么?

要在WPF中获得ListView的选择行为以赶上WinForms,我需要做什么?,wpf,listview,multipleselection,Wpf,Listview,Multipleselection,基本上,我正在尝试激活或实现两件事: 一,。单击背景时清除所选内容: 通常,当在列表视图类型控件(如windows资源管理器)的空白区域中单击时,所有选定的项都将被取消选中。无论是在多重选择模式还是扩展选择模式下,这都不会发生在我身上。我是否必须手动处理鼠标单击事件以清除选择,或者可能由于我已将背景应用于控件而导致其行为不符合预期 二,。自动滚动的选择矩形: 在将我的应用程序移植到WPF之前,标准WinForms listview允许我拖动一个选择矩形,它将选择与其相交的任何项目。如果有项目在任

基本上,我正在尝试激活或实现两件事:

一,。单击背景时清除所选内容:

通常,当在列表视图类型控件(如windows资源管理器)的空白区域中单击时,所有选定的项都将被取消选中。无论是在多重选择模式还是扩展选择模式下,这都不会发生在我身上。我是否必须手动处理鼠标单击事件以清除选择,或者可能由于我已将背景应用于控件而导致其行为不符合预期

二,。自动滚动的选择矩形:


在将我的应用程序移植到WPF之前,标准WinForms listview允许我拖动一个选择矩形,它将选择与其相交的任何项目。如果有项目在任何方向上滚动到视图外,则在该方向上拖动将导致控件在我拖动鼠标时自动滚动到该区域,以便我可以选择视图外的项目。WPF ListView实现了这个特性,还是我必须自己实现它?有人在该页面的评论中发布了一个涉及hittests的非平凡实现,但它甚至不支持自动滚动,我很难相信Microsoft刚刚忽略了此功能。

确实ListView没有默认外观,您必须使用触发器设置甚至是基本选择。 哇,这颜色和显示选定的索引没有单一的样式或触发器。 全部在XAML中

<Window.Resources>
    <sys:String x:Key="MyString">Hello</sys:String>
    <x:Array x:Key="MyStringArray" Type="sys:String">
        <sys:String>Hello</sys:String>
        <sys:String>World</sys:String>
        <sys:String>Continent</sys:String>
        <sys:String>Universe</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <StackPanel Orientation="Vertical">
        <ListView ItemsSource="{StaticResource MyStringArray}" x:Name="lv" SelectionMode="Single"  LostFocus="lv_LostFocus">
        </ListView>
        <TextBlock Text="{Binding ElementName=lv, Path=SelectedIndex}" />
        <Button Content="Take Focus"/>
    </StackPanel>
</Grid>

    private void lv_LostFocus(object sender, RoutedEventArgs e)
    {
        lv.SelectedIndex = -1;
    }

这里也提出了类似的问题:,但发布的实现和另一个答案的链接CodeProject文章都没有在拖动时实现自动滚动功能。什么版本的.NET?默认情况下,Selected,Not Focused是一个突出显示..NET 4.5,但我不确定您在说什么,因为WPF中没有默认外观;我必须设置所有东西,甚至是基本的选择和带有样式和触发器的悬停外观。真的吗?那么财产SelectedItem什么也没做?您必须使用触发器进行基本选择?也许你需要赶上WPF。不是为了选择,而是为了视觉效果。当使用控件模板时,例如,要使每个项目在其下显示一个图像和一个文件名,单击一个项目将选中它,但它不会在其周围绘制边框或以其他方式改变其外观。您必须使用附加到控件模板的IsSelected属性或IsMouseOver的触发器来执行此操作,该属性或IsMouseOver将显式更改该状态的边框颜色或背景。这如何回答OP的任何一个问题?@stenportov它解决了他必须使用触发器处理所有事情甚至基本选择的断言。哇,也许一个简单的损失事件可能就是诀窍。我想你误解了我的意思。当然,如果您只是在其中粘贴一个字符串数组,它会有一个默认的外观,但是如果您想充分利用控件的潜力并显示多个字符串数组,那么您必须使用自己的控件设置一个数据模板。执行此操作时,当您悬停或选择项目时,listview不会自动添加颜色或边框。它仍然在引擎盖下选择它们,但它不会以任何方式改变视觉效果。换句话说,默认情况下,它不会神奇地向控件模板添加选择边框或高亮显示。它也不支持像旧控件那样的选择矩形。有人称它是一个设计过度、精简的控件,缺少winforms listview所具有的基本功能。另一方面,不可否认的是,它更灵活,可以做得更多。。。只是有些事情需要做更多的工作,有些事情需要做更少的工作,我一点也不介意。我只是在寻找帮助来实现那些缺失的功能。但是你说没有默认的外观。LostFocus事件是否回答1。发布你的XAML——看起来你在思考表单,WPF是不同的。样式设置不限于字符串数组。为什么要手动选择?