如何在Silverlight中禁用列表框时启用滚动?

时间:2011-02-16 13:55:03

标签: silverlight listbox

我想禁用列表框(不允许用户选择)但在Silverlight中可滚动,我该怎么做?

1 个答案:

答案 0 :(得分:1)

如何不使用ListBox。尽管它是显示项目列表的真实手段,但ListBox的真正目的是从列表中选择

可以通过像这样设置ItemsControl来传递可滚动列表: -

    <Grid.Resources>
        <Style x:Key="ScrollableItemsControl" TargetType="ItemsControl">
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ItemsControl">
                        <Border CornerRadius="2" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                            <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" TabNavigation="{TemplateBinding TabNavigation}">
                                <ItemsPresenter />
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>                          
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>

现在,您将此样式应用于ItemsControl: -

    <ItemsControl Style="{StaticResource ScrollableItemsControl}" ItemsSource="{Binding SomeData}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding SomeProperty}" Margin="5" />
                    <TextBlock Text="{Binding SomeOtherProperty}" Margin="5" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

这是一个可滚动的列表,但没有ListBox的选择语义。请注意,视觉树中的中介元素比使用ListBox控件的方式更少。

修改

根据您的评论,可以轻松切换ListBox的选择行为而不禁用它。您可以禁用它包含的ListBoxItems

    <Grid.Resources>
        <Style x:Key="DisabledItem" TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False" />
        </Style>
    </Grid.Resources>

   <ListBox x:Name="lst" ItemsSource="{StaticResource TestData}" ItemContainerStyle="{StaticResource DisabledItem}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" Margin="5" />
                    <TextBlock Text="{Binding Age}" Margin="5" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

在这种情况下,ListBox以禁用的项目开始。然而,滚动仍然是可能的。但是这些项目显示为灰色,并且没有悬停或选定的突出显示。

以下代码可以打开和关闭“禁用”状态。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (lst.ItemContainerStyle == null)
            lst.ItemContainerStyle = (Style)LayoutRoot.Resources["DisabledItem"];
        else
            lst.ItemContainerStyle = null;
    }