【问题标题】:Is there something like a WPF listview without the selection?有没有像 WPF 列表视图这样没有选择的东西?
【发布时间】:2013-07-25 08:08:43
【问题描述】:

我正在开发的应用程序有一种由扩展器组成的手风琴,但每个扩展器独立运行,而不是一次只允许打开一个项目。每个扩展器都与视图模型中集合中的一个项目相关。

我目前的解决方案是使用列表框,然后将列表 itemsource 绑定到集合,并让项目模板呈现扩展器和扩展器内容。

问题在于列表框将每个扩展器视为一个项目(显然)并允许选择和突出显示。突出显示有点难看,可以禁用,但选择会给我带来一些问题,因为它会导致列表滚动以尽可能多地显示展开的扩展器。

是否有一个有点像堆栈面板(也许)的 WPF 控件,它允许我使用项目模板绑定包含的控件,但没有选择和突出显示?

            <ListBox Grid.Row="0" Grid.Column="0" Width="Auto" SelectionMode="Single" ItemsSource="{Binding Path=MeasurementSources}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Expander  Header="{Binding Name}" IsEnabled="{Binding Available}">
                        <ListBox Width="Auto" SelectionMode="Single"
                                ItemsSource="{Binding Path=Measurements}"
                                SelectedItem="{Binding Path=SelectedMeasurement}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <WrapPanel>
                                        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                                        <TextBlock Text=" "/>
                                        <TextBlock Text="{Binding Created}"/>
                                    </WrapPanel>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </Expander>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

【问题讨论】:

  • 参考这个链接,你可以像下面这样隐藏列表框的选择http://stackoverflow.com/questions/1398559/there-is-no-listbox-selectionmode-none-is-there-another-way -禁用选择
  • 我不确定您到底在寻找什么,但ItemsControl 可能就是它。
  • 乔恩,这正是我所需要的。我已将列表更改为项目控件(顺便说一句,我的工具箱中未显示),现在我的扩展器按我想要的方式工作。

标签: wpf wpf-controls


【解决方案1】:

如果您想要没有选择功能的类似列表的功能,您应该使用ItemsControl - 顺便说一下Selector 的基类,它又是ListBox 的基类

然后整个事情就变成了

<ItemsControl Width="Auto" ItemsSource="{Binding Measurements}"
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <WrapPanel>
        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
        <TextBlock Text=" "/>
        <TextBlock Text="{Binding Created}"/>
      </WrapPanel>
    </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

显然,在这种情况下,您无法绑定选定的项目。

【讨论】:

  • 是的,我认为你和乔恩一针见血。这是我需要的 ItemsControl。
【解决方案2】:

这是一条我没有意识到的有用信息。

http://msdn.microsoft.com/library/windows/apps/hh780657.aspx

注意 ItemsControl 是几个常用集合的基类 控件,包括 ListView、GridView、FlipView、ListBox 和 组合框控件。这些示例使用 ListView 和 GridView 控件,但该信息通常适用于 ItemsControls。

换句话说,使用 ItemsControl 确实是解决我的问题的方法,因为使用 ListBox 然后尝试禁用突出显示和选择功能确实将其转回它自己的基类。

【讨论】:

    【解决方案3】:

    对我来说最好的解决方案:

     <Style TargetType="{x:Type ListBoxItem}">
          <Style.Resources>
              <!-- With focus -->
              <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                                     Color="Transparent" />
              <!-- Without focus -->
              <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                                     Color="Transparent" />
              <!-- Text foreground -->
              <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
                                     Color="Black" />
          </Style.Resources>
          <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
    </Style>
    

    几个月前我在stackoverflow 的某个地方找到了它:)

    【讨论】:

    • Mateusz,我想这可能是一个解决方案,但我更喜欢 Jon 提出的解决方案,其中我使用了 itemscontrol。它只是为我提供了我需要的所有行为,而无需禁用我不需要的行为。不过谢谢你的回复。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多