[英]How to find the actual scrollbar height inside a scrollviewer control
我正在嘗試對尺寸擴大的畫布進行智能滾動。 我希望滾動條自動轉到其范圍的中心。 所以我用:
eagleViewer.ScrollToVerticalOffset(drawingSpace.Height/2);
eagleViewer.ScrollToHorizontalOffset(drawingSpace.Width/2);
哪個可行,但是當滾動條滾動時,它們超出了半點,似乎是頂部對齊的。 所以我想減去滾動條的高度或寬度,以使滾動條在畫布上居中。
我在其他文章中讀到了我可以做到的
SystemParameters.ScrollHeight
要么
SystemParameters.ScrollWidth
但是,如何運作? 我在窗口中有多個滾動查看器。 我想要此特定scrollviewer的滾動條的高度或寬度。
還有其他我不知道的方式嗎?
謝謝
編輯:
添加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>
我在這里添加了另一個答案,因為我想發布更多代碼。 您給了正確的關鍵字:“在我運行scrolltoverticaloffset代碼之前,畫布高度發生在行上”。 通過這樣做,我可以重現該問題。 問題是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);
}
}
}
}
這應該做的工作:
scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight/2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.