WPF 的Listbox 滾動處理
阿新 • • 發佈:2018-11-23
操作需求場景:Listbox 高150 item 高150 listbox有幾十個item ,希望滑鼠滾輪滾動一次listbox 能滾動到下一個item,
程式碼實現:
<Grid x:Name="gd"> <Grid.RowDefinitions> <RowDefinition Height="158" /> <RowDefinition /> </Grid.RowDefinitions> <Grid Grid.Row="0" Name="firstrowgrid"> <ListBox ScrollViewer.PanningRatio="1" PreviewMouseWheel="waterfalllistbox_PreviewMouseWheel" ScrollViewer.ScrollChanged="waterfalllistbox_ScrollChanged" HorizontalAlignment="Stretch" ScrollViewer.CanContentScroll="False" SelectedIndex="{Binding Selectindex,Mode=TwoWay}" ScrollViewer.IsDeferredScrollingEnabled="False" SelectionChanged="waterfalllistbox_SelectionChanged" ScrollViewer.VerticalScrollBarVisibility="Visible" VirtualizingStackPanel.VirtualizationMode="Standard" VirtualizingStackPanel.IsVirtualizing="True" ItemsSource="{Binding WaterFallPoints2}" x:Name="waterfalllistbox"> <ListBox.ItemTemplate> <DataTemplate> <Grid Height="150"> <element:PtrRenderCompatible MouseDown="PtrRenderCompatible_MouseDown" Width="{Binding Width}" Height="150" PointItemsSource="{Binding DataPoints}" Brushes="{Binding BrushInfo}"/> <TextBlock Text="{Binding StartTime}" Foreground="Blue" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="12"></TextBlock> </Grid> </DataTemplate> </ListBox.ItemTemplate> <ListBox.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel Orientation="Vertical"></VirtualizingStackPanel> </ItemsPanelTemplate> </ListBox.ItemsPanel> </ListBox> <Line x:Name="rline" MouseLeftButtonDown="rline_MouseLeftButtonDown" Visibility="Collapsed"></Line> <Border Background="#ED9121" HorizontalAlignment="Right" VerticalAlignment="Top"> <StackPanel Width="60" Height="50"> <TextBlock TextAlignment="Center" Foreground="White" Text="選擇導聯:" Margin="0,2,0,2"></TextBlock> <ComboBox ItemsSource="{Binding LeadList}" Mvc.Event="SelectionChanged" Mvc.Action="{Binding SelectLeadAction}" SelectedItem="{Binding WaterFallSelectedLead,Mode=TwoWay}"> </ComboBox> </StackPanel> </Border> </Grid>
ui介面程式碼如上,重點是重寫 waterfalllistbox_PreviewMouseWheel 滑鼠滾輪事件
private void waterfalllistbox_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { e.Handled = true; ScrollViewer obj = VisualHelper.FindChildren<ScrollViewer>(waterfalllistbox).First();Debug.WriteLine("ScrollableHeight:" + obj.ScrollableHeight); Debug.WriteLine("VerticalOffset:" + obj.VerticalOffset); Debug.WriteLine("ContentVerticalOffset:" + obj.ContentVerticalOffset); Debug.WriteLine("e.Delta:" + e.Delta); if (e.Delta < 0) { obj.PageDown();//向下滾動} else { obj.PageUp();// } }
注意:item 的高度是150,由於listboxitem 有預設的外邊距和內邊距,所以listbox 所在的行的高度為158
這樣的話 就能在豎向滑動的時候,可以一次滑動一個。
擴充套件:橫向滑動的時候
ScrollViewer.PageLeft(), PageRight()
Listbox 滑鼠滾動的時候預設呼叫的是
ScrollViewer.LineDown()各個方向的line 方法;
在鍵盤按住上下箭頭的時候預設呼叫pagedown 等各個方法。
(●'◡'●) 打賞個包子也很贊奧