Как переопределить поведение по умолчанию для Silverlight ListBox? - PullRequest
1 голос
/ 19 августа 2010

Элемент управления Silverlight ListBox автоматически перемещает поле прокрутки при щелчке по показанному элементу списка (если в списке отображается 5 элементов, щелкните по последнему элементу, и все элементы будут перемещены вниз на один). У меня есть ошибка от моей команды QA, говорящая мне, что это вызывает путаницу в нашем конкретном случае. Как я могу переопределить это поведение?

    <ListBox x:Name="accountsListBox" Margin="8,65,8,8" SelectionChanged="accountsListBox_SelectionChanged" VirtualizingStackPanel.VirtualizationMode="Recycling">
                    <ListBox.BorderBrush>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="Black" Offset="0"/>
                            <GradientStop Color="Silver" Offset="1"/>
                        </LinearGradientBrush>
                    </ListBox.BorderBrush>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Height="19" Text="{Binding}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            List<string> names = new List<string>();
            for (int i = 0; i < 100; i++)
            {
                names.Add("Name " + i);
            }

            this.accountsListBox.ItemsSource = names;

        }

        private void accountsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
// this was an attempt but causes other unwanted behavior
            //int selectedIndex = this.accountsListBox.SelectedIndex;
            //this.accountsListBox.UpdateLayout();
            //this.accountsListBox.ScrollIntoView(this.accountsListBox.Items[this.accountsListBox.SelectedIndex - 4]);
            //this.accountsListBox.SelectedIndex = selectedIndex;
        }
    }

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Нет необходимости переопределять поведение. Это не ошибка, а функция прокрутки частично отображаемых элементов списка в поле зрения.

Режим автоматической прокрутки вызван тем, что список не достаточно высок для 5 элементов (даже если он выглядит так). Сделайте список на несколько пикселей выше, и проблема исчезнет.

Надеюсь, это поможет.

0 голосов
/ 19 февраля 2011

Если вы хотите запретить автоматическую прокрутку ListBox для отображения всего выбранного элемента, присвойте его ScrollViewer собственный стиль (см. Ниже), а в шаблоне задайте для вертикальной полосы прокрутки верхнее и нижнее поле 1000. Далее, присвойте списку верхнее и нижнее поле 1000 и установите его стиль, который использует измененный стиль scrollviewer. Затем обрежьте список (как показано ниже), чтобы он не закрывал все, что может быть над ним. Наконец, всякий раз, когда вы добавляете элементы в список, сначала добавьте пустой ListBoxItem, имеющий высоту 1000, а затем добавьте в конец элементов другой пустой ListBoxItem с высотой 1000.

<Style x:Key="ScrollViewerStyleForWhiteBg" TargetType="ScrollViewer">
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ScrollViewer">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="ScrollStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="00:00:00.5"/>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Scrolling">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="VerticalScrollBar"/>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HorizontalScrollBar"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="NotScrolling"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Grid Margin="{TemplateBinding Padding}">
                            <ScrollContentPresenter x:Name="ScrollContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"/>
                            <ScrollBar x:Name="VerticalScrollBar" Margin="0,1000,0,1000" HorizontalAlignment="Right" Height="Auto" IsHitTestVisible="False" IsTabStop="False" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Opacity="0" Orientation="Vertical" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{TemplateBinding VerticalOffset}" ViewportSize="{TemplateBinding ViewportHeight}" VerticalAlignment="Stretch" Width="5" Background="Red" />
                            <ScrollBar x:Name="HorizontalScrollBar" HorizontalAlignment="Stretch" Height="5" IsHitTestVisible="False" IsTabStop="False" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Opacity="0" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{TemplateBinding HorizontalOffset}" ViewportSize="{TemplateBinding ViewportWidth}" VerticalAlignment="Bottom" Width="Auto" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
<Style x:Key="ListBoxStyleForReader" TargetType="ListBox">
        <Setter Property="Padding" Value="0"/>
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}"
                                  Style="{StaticResource ScrollViewerStyleForWhiteBg}">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
<ListBox x:Name="_myList" Margin="0,-1000,0,-1000" Style="{StaticResource ListBoxStyleForReader}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            <ListBox.Clip>
                <RectangleGeometry Rect="0,1000,480,10000" />
            </ListBox.Clip>
        </ListBox>
_myList.Insert(0, new ListBoxItem() { Height = 1000 });
_myList.Add(new ListBoxItem() { Height = 1000 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...