如何在scrollviewer控件中找到实际的滚动条高度

时间:2015-05-09 16:03:19

标签: c# wpf scrollviewer

我试图为尺寸扩大的画布进行智能滚动。我希望滚动条自动转到其范围的中心。所以我用:

eagleViewer.ScrollToVerticalOffset(drawingSpace.Height/2);
eagleViewer.ScrollToHorizontalOffset(drawingSpace.Width/2);

哪个有效,但当滚动条滚动它们超出半点时,它似乎是顶部对齐的。所以我想减去滚动条的高度或宽度,这样滚动条就会完全居中在画布上。

我在其他帖子中读到我可以做到这一点

SystemParameters.ScrollHeight 

SystemParameters.ScrollWidth

但这怎么办?我在窗口中有多个滚动查看器。我想要这个特定滚动查看器的滚动条的高度或宽度。

我不知道的任何其他方式?

由于

编辑:

添加XAML部分:

<ScrollViewer Name="eagleViewer" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" Height="Auto" Width="Auto">
                        <Grid Name="eagleGrid" Background="LightGray">
                            <Canvas Name="drawingSpace" Background="WhiteSmoke" Width="100" Height="100">
                                <Canvas.LayoutTransform>
                                    <ScaleTransform CenterX="0" CenterY="0" ScaleX="{Binding ElementName=zoomEagleSlider,Path=Value}" ScaleY="{Binding ElementName=zoomEagleSlider,Path=Value}"/>
                                </Canvas.LayoutTransform>
                            </Canvas>
                        </Grid>
                    </ScrollViewer>

2 个答案:

答案 0 :(得分:1)

我在这里添加另一个答案,因为我想发布更多代码。您给出了正确的关键字:&#34;在运行scrolltoverticaloffset代码&#34;之前,画布高度更改发生在该行上。通过这样做,我可以重现这个问题。问题是ScrollViewer显然会在稍后评估ScrollableHeight属性。这意味着您需要延迟使用ScrollableHeight。找到正确的观点有点棘手。在我的以下测试应用程序中,在内容的高度更改为滚动条的中心后,我使用第一个ScrollChanged事件。

<Window x:Class="ScrollViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="350">
    <Grid>
        <ScrollViewer Name="SV"
                      Margin="71,62,10,10"
                      HorizontalContentAlignment="Stretch"
                      VerticalContentAlignment="Stretch"
                      HorizontalScrollBarVisibility="Auto"
                      VerticalScrollBarVisibility="Auto">
                <Border x:Name="SVContent" Background="#FFFFA6A6"
                        BorderBrush="#FF005DFF"
                        Width="200"
                        Height="200"
                        BorderThickness="1" />
        </ScrollViewer>
        <Button Width="75"
                Margin="28,20,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="Button_Click"
                Content="Button" />
    </Grid>
</Window>

CS:

using System;
using System.Windows;
using System.Windows.Controls;

namespace ScrollViewer
{
    public partial class MainWindow : Window
    {
        public MainWindow ()
        {
            InitializeComponent ();
            SV.ScrollChanged += ScrollChangedEventHandler;
        }

        bool firstScrollAfterContenChanged;

        private void Button_Click (object sender, RoutedEventArgs e)
        {
            firstScrollAfterContenChanged = true;
            SVContent.Height = 1000;
        }

        public void ScrollChangedEventHandler(Object sender, ScrollChangedEventArgs e)
        {
            if (firstScrollAfterContenChanged)
            {
                firstScrollAfterContenChanged = false;
                SV.ScrollToVerticalOffset (SV.ScrollableHeight / 2);
            }
        }
    }
}

答案 1 :(得分:0)

这应该做的工作:

        scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight/2);