Scrollviewer не показывает полосы прокрутки с отрицательными полями

1

Я пытаюсь добавить функцию прокрутки в свое приложение. В основном с помощью колеса мыши вы можете прокручивать вверх и вниз, или если вы удерживаете Shift, вы можете прокручивать влево и вправо.

Я создал небольшое примерное приложение, чтобы продемонстрировать проблему, которая у меня есть.

Я использую ScrollViewer, который содержит Canvas. Я помещаю Rectangle на холст, чтобы представлять документ Control, который я буду использовать в реальном приложении. Изображение 174551

Все работает отлично, когда я пытаюсь прокручиваться с помощью колеса мыши. Вертикальная полоса прокрутки отображается просто отлично, поэтому пользователь может вернуться к предыдущему позиционированию, перетащив ее: Изображение 174551

Проблема в том, что я пытаюсь прокрутить вниз. Вертикальная полоса прокрутки не отображается, поэтому единственный способ вернуться к предыдущей позиции - использовать колесико мыши. Изображение 174551

Та же проблема может наблюдаться при прокрутке в горизонтальном направлении (путем удерживания 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

Теги:
wpf
canvas
scrollbar
scrollviewer

1 ответ

0

В качестве обходного пути сейчас я заменил элемент управления scrollview на регулярную сетку и добавил свои собственные элементы управления ScrollBar (вертикальные и горизонтальные). Это позволило мне настроить свое поведение в соответствии с моими требованиями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню