15

我们有一个场景,我们想要显示一个项目列表并指示哪个是“当前”项目(带有一个小箭头标记或更改的背景颜色)。

ItemsControl 对我们没有好处,因为我们需要“SelectedItem”的上下文。但是,我们希望以编程方式移动选择,并且不允许用户更改它。

有没有一种简单的方法可以使 ListBox 非交互式?我们可以通过故意吞下鼠标和键盘事件来伪造它,但是我是否缺少一些基本属性(例如将“IsEnabled”设置为 false 而不会影响其视觉风格),这些属性可以提供我们想要的东西?

或者......是否有另一个 WPF 控件是两全其美的 - 具有 SelectedItem 属性的 ItemsControl?

4

4 回答 4

19

一种选择是设置ListBoxItem.IsEnabledfalse

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

这可确保项目不可选择,但它们可能无法呈现您喜欢的方式。要解决此问题,您可以使用触发器和/或模板。例如:

<ListBox x:Name="_listBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
于 2008-10-02T08:35:28.053 回答
3

我遇到过同样的问题。我通过将 IsEnabled 设置为 true 并处理 ListBox 的 PreviewMouseDown 事件来解决它。在您不希望编辑它的情况下,在处理程序中将 e.Handled 设置为 true。

    private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = !editRights;
    }
于 2011-02-08T22:31:08.627 回答
1

您的 ItemsControl/ListBox 是数据绑定的吗?

我只是想您可以将每个项目的背景画笔绑定到源数据中的属性,或者通过转换器传递属性。就像是:

  <ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Margin="0">
    <ItemsControl.Resources>
      <local:SelectedConverter x:Key="conv"/>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <local:Control Background="{Binding Path=IsSelected, Converter={StaticResource conv}}"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
于 2008-10-02T07:42:12.207 回答
0

可以解决问题的神奇咒语是:

<ListBox IsHitTestVisible="False">

不幸的是,这也会阻止任何滚动条工作。

解决方法是将列表框放在滚动查看器中:

<ScrollViewer>
    <ListBox IsHitTestVisible="False">
    </ListBox>
</ScrollViewer>
于 2021-11-02T10:59:43.120 回答