-1
我有几个滚动显示隐藏的垂直和水平滚动条。我希望屏幕上的滚动条不属于任何滚动视图,它应该能够控制(同步)所有滚动视图的滚动。换句话说,当我滚动“主”滚动条时,我可以让所有滚动视图以相同的偏移量滚动。可能吗?如果是的话,我该怎么做到呢?提前致谢。WPF滚动条控制其他滚动查看
我有几个滚动显示隐藏的垂直和水平滚动条。我希望屏幕上的滚动条不属于任何滚动视图,它应该能够控制(同步)所有滚动视图的滚动。换句话说,当我滚动“主”滚动条时,我可以让所有滚动视图以相同的偏移量滚动。可能吗?如果是的话,我该怎么做到呢?提前致谢。WPF滚动条控制其他滚动查看
下面是一个解决方案的例子。
背后public MainWindow()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
((FrameworkElement)svContainer1.Content).SizeChanged += new SizeChangedEventHandler(content_SizeChanged);
sbScroller.Minimum = 0;
sbScroller.Maximum = svContainer1.ExtentHeight - svContainer1.ViewportHeight;
}
void content_SizeChanged(object sender, SizeChangedEventArgs e)
{
sbScroller.Minimum = 0;
sbScroller.Maximum = svContainer1.ExtentHeight - svContainer1.ViewportHeight;
}
//ScrollBar event handler
private void ScrollBar_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
{
UpdateScrollOffset(sbScroller.Value);
}
//Updates the offset of both ScrollViewer
public void UpdateScrollOffset(double newOffset)
{
svContainer1.ScrollToVerticalOffset(newOffset);
svContainer2.ScrollToVerticalOffset(newOffset);
}
//Event handler for all ScrollViewers
private void Grid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
UpdateScrollOffset(e.VerticalOffset);
}
XAML代码
代码:
<Grid ScrollViewer.ScrollChanged="Grid_ScrollChanged">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="svContainer1" VerticalScrollBarVisibility="Hidden" Grid.Column="0">
<Grid Height="1000">
<Grid.RowDefinitions>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
</Grid.RowDefinitions>
<Rectangle Fill="Red" Grid.Row="0"/>
<Rectangle Fill="Green" Grid.Row="1"/>
<Rectangle Fill="Violet" Grid.Row="2"/>
<Rectangle Fill="Blue" Grid.Row="3"/>
</Grid>
</ScrollViewer>
<ScrollViewer x:Name="svContainer2" VerticalScrollBarVisibility="Hidden" Grid.Column="1">
<Grid Height="1000">
<Grid.RowDefinitions>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
<RowDefinition Height=".25*"/>
</Grid.RowDefinitions>
<Rectangle Fill="Red" Grid.Row="0"/>
<Rectangle Fill="Green" Grid.Row="1"/>
<Rectangle Fill="Violet" Grid.Row="2"/>
<Rectangle Fill="Blue" Grid.Row="3"/>
</Grid>
</ScrollViewer>
<ScrollBar x:Name="sbScroller" Grid.Column="3" Minimum="0" Scroll="ScrollBar_Scroll" Maximum="100"/>
</Grid>
其实,有没有简单的方法。您必须收听ScrollBar事件并更新ScrollViewers的偏移量。您还必须收听ScrollViewer的内容大小更改,以便更新ScrollBar的滚动边界。
为什么你不能把所有的内容放在一个ScrollViewer中,并通过使用Grid将它们分隔列? – Dmitry
@Didier因为可能有多个滚动查看器具有外部滚动查看器。例如多个FlowDocuments,其外部具有一个ScrollViewer作为其父,即ListBox。 –