Как включить прокрутку, когда список отключен в Silverlight? - PullRequest
2 голосов
/ 16 февраля 2011

Я хочу отключить список (не разрешать пользователю выбирать), но прокручивать его в Silverlight, как я могу это сделать?

1 Ответ

1 голос
/ 16 февраля 2011

Как насчет не использовать 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...