2015-05-09 4 views
1

Я пытаюсь сделать интеллектуальную прокрутку для холста, который расширяется по размеру. Я хочу, чтобы полосы прокрутки автоматически переходили в центр их диапазона. Поэтому я использую:Как найти фактическую высоту полосы прокрутки внутри элемента управления scrollviewer

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

Который работает, но когда скроллбары прокручивать они выходят за пределы половины точки, кажется, это верх выровнен. Поэтому я хотел бы вычесть ширину или ширину полосы прокрутки, чтобы полосы прокрутки были идеально центрированы на холсте.

Я читал в других постах, что я могу сделать это в

SystemParameters.ScrollHeight 

или

SystemParameters.ScrollWidth 

Но как это работает? У меня есть несколько scrollviewers в окне. Я хочу высоту или ширину полос прокрутки этого конкретного scrollviewer.

Любой другой способ, которым я не осведомлен?

Благодаря

Edit:

Добавление раздела 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> 

ответ

1

я добавляю еще один ответ здесь, потому что я хотел бы опубликовать некоторые больше кода. Вы дали правильное ключевое слово: «Изменение высоты холста происходит на линии до того, как я запустил код 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); 
      } 
     } 
    } 
} 
0

Это должно сделать работу:

 scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight/2); 
+0

Это не сработало, при отладке я получаю ноль для scrollableheight. высота «пространства» холста составляет около 3000. – Process

+0

Хм, он работает в моем тестовом приложении. ScrollableHeight - это содержимое ScrollViewer, которое можно перемещать (прокручивать). Допустим, что высота контента составляет 300, а высота ScrollViewer равна 250, ScrollableHeight - 50. Поскольку ваш ScrollableHeight равен нулю, что является индикатором, высота ScrollViewer не меньше, чем высота контента (что не должно быть дело). Можете ли вы опубликовать больше кода XAML, чтобы узнать больше об окружающей среде? – gomi42

+0

отредактировал сообщение с XAML. Canvas 100 в этом коде, но когда программа запускается, он пересчитывается и изменяется на 3000. Изменение высоты холста происходит в строке до того, как я запустил код scrolltoverticaloffset. – Process