禁用Listview中的元素选择?

时间:2012-03-19 10:27:37

标签: wpf listview

如何禁用Listview中元素的选择?

当我在ListView中单击elem时,我不想更改背景。 你能救我吗?

<ListView Name="milestone_listView" Margin="817,108,90,276" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" ItemsSource="{Binding}">
        <Grid Name="milestone_grid"></Grid>
    </ListView>

6 个答案:

答案 0 :(得分:8)

通常我只是将SelectedItem画笔覆盖为透明,但如果您不想要选择功能,也可以使用ItemsControl来显示列表

<ListView.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
</ListView.Resources>

如果您确实使用ItemsControl,请注意默认情况下它不会实施虚拟化,因此如果您需要,则必须implement it yourself

答案 1 :(得分:8)

如果您不想选择任何项目,请使用ItemsControl而不是ListView。

ItemsControl可以执行ListView可以执行的所有操作,而不是选择。

编辑:

如果您需要UI虚拟化,则需要使用ItemsControl执行更多操作。但我认为你现在不应该担心。从您的代码示例中我甚至认为您无论如何都不需要它。在需要时优化代码,不要过早地尝试优化。目前只需对作为ItemsControl的作业使用正确的控件。

答案 2 :(得分:2)

我使用的技巧是处理SelectionChanged事件并撤消选择,比如将SelectedIndex设置为-1:

<ListView SelectionChanged="ListView_SelectionChanged" />

在代码隐藏中:

    private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var listView = sender as ListView;
        if (listView != null)
        {
            listView.SelectedIndex = -1;
        }
    }

答案 3 :(得分:2)

或者,您可以采用更简单的方法将ListViewItem的IsEnabled属性设置为False。

在下面的示例中,我对绑定到ListView的项目有一个'Locked'属性。当这是真的时,我使用以下数据触发器来禁用相关的ListViewItem,然后我使用其他样式来在视觉上区分它。

    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Locked}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Resources>

答案 4 :(得分:0)

我通过将IsHitTestVisible设置为false来解决它。当然,它不适用于所有可能的情况,但在某些情况下它可能会有所帮助。

答案 5 :(得分:0)

此解决方案允许您通过阻止点击事件冒泡来设置ListViewItem模板中的某些元素,而不会触发行选择。

将此属性附加到元素。

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace YourNamespaceName
{
    public class CancelMouseBubbling : DependencyObject
    {
        public static readonly DependencyProperty ActiveProperty = DependencyProperty.RegisterAttached(
            "Active",
            typeof(bool),
            typeof(CancelMouseBubbling),
            new PropertyMetadata(false, ActivePropertyChanged));

        /// <summary>
        /// Subscribe to the events we need.
        /// </summary>
        private static void ActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var element = d as FrameworkElement;
            if (element != null)
            {
                if ((e.NewValue as bool?).GetValueOrDefault(false))
                {
                    element.PreviewMouseLeftButtonDown += ElementOnPreviewMouseLeftButtonDown;
                    element.MouseLeftButtonDown += ElementOnMouseLeftButtonDown;
                }
                else
                {
                    element.PreviewMouseLeftButtonDown -= ElementOnPreviewMouseLeftButtonDown;
                    element.MouseLeftButtonDown -= ElementOnMouseLeftButtonDown;
                }
            }
        }

        /// <summary>
        /// Block some events from bubbling at the OriginalSource.
        /// </summary>
        private static void ElementOnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
        {
            if (mouseButtonEventArgs.Source is Panel)
            {
                mouseButtonEventArgs.Handled = true;
            }
        }

        /// <summary>
        /// Block all clicks from going past the element CancelMouseBubbling is set on
        /// </summary>
        private static void ElementOnMouseLeftButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
        {
            mouseButtonEventArgs.Handled = true;
        }

        [AttachedPropertyBrowsableForChildrenAttribute(IncludeDescendants = false)]
        [AttachedPropertyBrowsableForType(typeof(FrameworkElement))]
        public static bool GetActive(DependencyObject @object)
        {
            return (bool)@object.GetValue(ActiveProperty);
        }

        public static void SetActive(DependencyObject @object, bool value)
        {
            @object.SetValue(ActiveProperty, value);
        }
    }
}

声明一个名称空间,以便您可以访问它:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:ut="clr-namespace:YourNamespaceName"></UserControl>

并将其附加到元素上。

<Border ut:CancelMouseBubbling.Active="True" Background="#55171717">
...
</Border>