使WPF中的列表框项不可选

时间:2009-11-12 14:12:07

标签: wpf listbox

我在WPF中有一个列表框,当他们选择一个项目时,它会显示一个难看的颜色 我可以让所有项目都不可选吗?

12 个答案:

答案 0 :(得分:89)

如果您不需要选择,请使用ItemsControl而不是ListBox

答案 1 :(得分:27)

在ListBoxItem样式中将Focusable属性添加为false:

<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <!-- Possibly other setters -->
  <Setter Property="Focusable" Value="False" />
</Style>

答案 2 :(得分:13)

请在列表框中使用此内容。我找到了这个非常优雅的解决方案

<ListBox ItemsSource="{Binding YourCollection}">
    <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
           <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

答案 3 :(得分:12)

如果您不希望它们可选,那么您可能不想要列表视图。 但如果这是你真正需要的,那么你可以用一种风格来做:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>


<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ListBoxItem}">
        <Border 
          Name="Border"
          Padding="2"
          SnapsToDevicePixels="true">
          <ContentPresenter />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Border" Property="Background" Value="#DDDDDD"/>
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="#888888"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

  </Page.Resources>
  <Grid>  
    <ListBox>
      <ListBoxItem>One</ListBoxItem>
      <ListBoxItem>Two</ListBoxItem>
      <ListBoxItem>Three</ListBoxItem>
    </ListBox>
  </Grid>
</Page>

查看IsSelected触发器。您可以将边框设置为不同的颜色,使其不“丑陋”或将其设置为透明,并且在选中时不会显示。

希望这有帮助。

答案 4 :(得分:4)

有一种更简单的方法:设置ListBox属性IsHitTestVisible="False"。这可以防止列表中的所有项目都接收鼠标事件。这样做的好处是可以在鼠标悬停时停止突出显示。

它适用于WP 7.1。

答案 5 :(得分:3)

一种简单的方法(使用上面的viky的答案)是在SelectionChanged()中将所选索引设置为-1,如下所示。

public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e)
{
    if (null != sender && sender is ListView)
    {
        ListView lv = sender as ListView;
        lv.SelectedIndex = -1;
    }
}

答案 6 :(得分:2)

最好避免事件,它更优雅,没有副作用Style标签。

<ListBox>
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="IsEnabled" Value="False"/>
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        ... what you want as a source ...
       </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

答案 7 :(得分:1)

您可以处理ListBox的SelectionChanged事件,并在事件处理程序中取消选择所选项目。

答案 8 :(得分:1)

如果有人仍想要不可选择的ListBoxItem(或ListViewItem)功能。 http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

答案 9 :(得分:0)

您还可以禁用列表框,它将为您提供静态的非交互式列表框。

<ListBox IsEnabled="False"/>

我认为这是解决方案尽可能简单。

答案 10 :(得分:0)

在我的例子中,我使用Textblock和ComboBox模板化了ListboxItems。唯一的#34;活跃的&#34;应该是组合......

<ScrollViewer VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Disabled"
              CanContentScroll="True" />
    <ItemsControl>
     ....here my content....
    </Itemscontrol>
</ScrollViewer>

按预期为我工作。 BR, 丹尼尔

答案 11 :(得分:0)

您还可以处理PreviewMouseDown事件

要防止点击,您可以设置KeyboardNavigation.TabNavigation="None"

<ListView x:Name="Cards"
            .....
            PreviewMouseDown="CardMonthsDescriptors_OnPreviewMouseDown"
            KeyboardNavigation.TabNavigation="None"
>
...
private void Cards_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
        }