В 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="<"
Command="{x:Static ScrollBar.LineLeftCommand}"
CommandTarget="{Binding ElementName=scrollViewer}"/>
<RepeatButton x:Name="LineRightButton"
Grid.Column="2"
Grid.Row="1"
Content=">"
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.