Я пытаюсь добавить функцию прокрутки в свое приложение. В основном с помощью колеса мыши вы можете прокручивать вверх и вниз, или если вы удерживаете Shift, вы можете прокручивать влево и вправо.
Я создал небольшое примерное приложение, чтобы продемонстрировать проблему, которая у меня есть.
Я использую ScrollViewer, который содержит Canvas. Я помещаю Rectangle на холст, чтобы представлять документ Control, который я буду использовать в реальном приложении.
Все работает отлично, когда я пытаюсь прокручиваться с помощью колеса мыши. Вертикальная полоса прокрутки отображается просто отлично, поэтому пользователь может вернуться к предыдущему позиционированию, перетащив ее:
Проблема в том, что я пытаюсь прокрутить вниз. Вертикальная полоса прокрутки не отображается, поэтому единственный способ вернуться к предыдущей позиции - использовать колесико мыши.
Та же проблема может наблюдаться при прокрутке в горизонтальном направлении (путем удерживания Shift). Кажется, что scrollviewer знает, когда его содержимое превышает поля в положительном направлении, но не знает, когда контент идет в отрицательном направлении.
Я подумал о нескольких обходных решениях (увеличение размера холста, когда пользователь прокручивает вниз, например), но я считаю, что должно быть лучшее решение, и я просто что-то пропустил.
Здесь код: XAML:
<Window x:Class="ScrollingTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Scrolling Test" Height="400" Width="600">
<Grid>
<ScrollViewer Name="_scrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Background="Black">
<Canvas Name="_canvas" Background="Gray" Width="400" Height="300" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="150" Height="200" Fill="White"/>
</Canvas>
</ScrollViewer>
</Grid>
</Window>
Код позади:
namespace ScrollingTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_scrollViewer.PreviewMouseWheel += new MouseWheelEventHandler(_scrollViewer_PreviewMouseWheel);
}
void _scrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftShift))
{
if (e.Delta > 0)
ScrollLeft();
else
ScrollRight();
}
else
{
if (e.Delta > 0)
ScrollUp();
else
ScrollDown();
}
}
void ScrollLeft()
{
Thickness newMargin = _canvas.Margin;
newMargin.Left += 10;
_canvas.Margin = newMargin;
}
void ScrollRight()
{
Thickness newMargin = _canvas.Margin;
newMargin.Left -= 10;
_canvas.Margin = newMargin;
}
void ScrollUp()
{
Thickness newMargin = _canvas.Margin;
newMargin.Top += 10;
_canvas.Margin = newMargin;
}
void ScrollDown()
{
Thickness newMargin = _canvas.Margin;
newMargin.Top -= 10;
_canvas.Margin = newMargin;
}
}
}
Вы можете загрузить пример приложения (написанный с помощью Visual Studio 2010) здесь: http://www.filedropper.com/scrollingtest
В качестве обходного пути сейчас я заменил элемент управления scrollview на регулярную сетку и добавил свои собственные элементы управления ScrollBar (вертикальные и горизонтальные). Это позволило мне настроить свое поведение в соответствии с моими требованиями.