在WPF中禁用Scrollbar RepeatButtons时没有数据结束

时间:2012-09-18 07:37:38

标签: c# wpf vb.net repeatbutton

我有一个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="&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>

enter image description here

我希望在此端没有数据时禁用重复按钮。

也就是说当我滚动我的列表框数据时,并且当该特定一侧(即左,右)没有数据可用时,那么该侧的RepeatButton将被禁用。当我向后滚动时,将启用所述RepeatButton。

我在这里展示了一个图形表示。我相信可以正确澄清。

IMAGE1:

enter image description here

请检查左侧是否禁用了RepeatButton,因为左侧没有要滚动的数据。

图像2:

enter image description here

请检查右侧是否禁用了RepeatButton,因为没有数据要在右侧滚动。

这种类型的滚动是我想要实现的。我读了Wpf disable repeatbuttons when scrolled to top/bottom但没有用。

1 个答案:

答案 0 :(得分:1)

是的,很容易。

  • 摆脱ScrollViewer
  • Subclass ListBox组件并添加新属性CanScrollHorizo​​ntallyLeft / 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。