В WPF отключите полосу прокрутки RepeatButtons, когда на их концах нет данных

У меня есть контроль прокрутки. Его кодирование

<Window.Resources>        
    <DataTemplate x:Key="listBoxItemTemplate">
        <TextBlock />
    </DataTemplate>
    <ItemsPanelTemplate x:Key="itemsPanelTemplate">
        <VirtualizingStackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="0"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <RepeatButton x:Name="LineLeftButton" 
                Grid.Column="0"
                Grid.Row="1"
                Content="&lt;"      
                Command="{x:Static ScrollBar.LineLeftCommand}"      
                CommandTarget="{Binding ElementName=scrollViewer}"/>
    <RepeatButton x:Name="LineRightButton" 
                Grid.Column="2"
                Grid.Row="1"
                Content="&gt;" 
                Command="{x:Static ScrollBar.LineRightCommand}"      
                CommandTarget="{Binding ElementName=scrollViewer}"/>
    <ScrollViewer Grid.Column="1" Grid.Row="1"  x:Name="scrollViewer" 
                  VerticalScrollBarVisibility="Hidden" 
                  HorizontalScrollBarVisibility="Hidden">
        <ListBox Name="lst2"
                 Margin="0,0,0,0"
                 VerticalAlignment="Stretch" 
                 ItemsPanel="{StaticResource itemsPanelTemplate}"/>
    </ScrollViewer>
</Grid>

Я хочу отключить кнопки повтора, когда на этом конце нет данных.

То есть, когда я прокручиваю свои данные Listbox и в конце, когда нет данных, доступных на этой конкретной стороне (то есть слева, справа), то эта сторона RepeatButton будет отключена. Когда я прокручиваю назад, то упомянутая кнопка RepeatButton будет включена.

Я показываю графическое представление здесь. Я уверен, что могу уточнить правильно.

Изображение1:

Пожалуйста, проверьте, что кнопка RepeatButton отключена на левой стороне, поскольку данные не будут прокручиваться слева.

Image2:

Пожалуйста, убедитесь, что RepeatButton отключен с правой стороны, так как нет данных для прокрутки справа.

Этот тип прокрутки - это то, чего я пытаюсь достичь. Я читаю Wpf отключить кнопки повтора при прокрутке вверх / вниз, но бесполезно.

1 ответ

Решение

Да, это легко.

  • Избавьтесь от своего ScrollViewer
  • Подкласс компонента ListBox и добавьте новое свойство CanScrollHorizontallyLeft/Right
  • Подключитесь к событию ListBox ScrollBar.Scroll, например: <ListBox ScrollBar.Scroll="event_handler" />
  • Добавьте обнаружение и измените свойства соответственно.

    private void scroll_handler(object sender, ScrollEventArgs e) {
       ScrollBar sb = e.OriginalSource as ScrollBar;
    
       if (sb.Orientation == Orientation.Horizontal)
           return;
    
       if (sb.Value == sb.Maximum) {
           Debug.Print("At the bottom of the list!");
    }
    

    }

Кроме того, ScrollViewer может также предоставлять событие ScrollBar.Scroll, и вам не нужно создавать подклассы / создавать новые свойства. Вы можете сделать логику внутри scroll_handler и изменить команды CanExecute.

Другие вопросы по тегам