我有一个scrollviewer控件。它的编码
<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>
我希望在此端没有数据时禁用重复按钮。
也就是说当我滚动我的列表框数据时,并且当该特定一侧(即左,右)没有数据可用时,那么该侧的RepeatButton将被禁用。当我向后滚动时,将启用所述RepeatButton。
我在这里展示了一个图形表示。我相信可以正确澄清。
IMAGE1:
请检查左侧是否禁用了RepeatButton,因为左侧没有要滚动的数据。
图像2:
请检查右侧是否禁用了RepeatButton,因为没有数据要在右侧滚动。
这种类型的滚动是我想要实现的。我读了Wpf disable repeatbuttons when scrolled to top/bottom但没有用。
答案 0 :(得分:1)
是的,很容易。
<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。