2014-04-15 86 views
-1

我有几个滚动显示隐藏的垂直和水平滚动条。我希望屏幕上的滚动条不属于任何滚动视图,它应该能够控制(同步)所有滚动视图的滚动。换句话说,当我滚动“主”滚动条时,我可以让所有滚动视图以相同的偏移量滚动。可能吗?如果是的话,我该怎么做到呢?提前致谢。WPF滚动条控制其他滚动查看

+0

为什么你不能把所有的内容放在一个ScrollViewer中,并通过使用Grid将它们分隔列? – Dmitry

+0

@Didier因为可能有多个滚动查看器具有外部滚动查看器。例如多个FlowDocuments,其外部具有一个ScrollViewer作为其父,即ListBox。 –

回答

0

下面是一个解决方案的例子。

背后

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的滚动边界。