如何禁用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>
答案 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>