Scrollviewer未显示带负边距的滚动条

时间:2014-10-15 16:37:07

标签: c# wpf canvas scrollbar scrollviewer

我正在尝试向我的应用添加滚动功能。基本上使用鼠标滚轮可以上下滚动,或者如果按住Shift键,则可以向左和向右滚动。

我创建了一个小样本应用程序来演示我遇到的问题。

我正在使用包含Canvas的ScrollViewer。我在画布上放置一个Rectangle,以表示我将在实际应用程序中使用的文档Control。 enter image description here

当我尝试使用鼠标滚轮向上滚动时,一切正常。垂直滚动条看起来很好,因此用户可以通过拖动它返回到先前的定位: enter image description here

问题是当我尝试向下滚动时。垂直滚动条不会出现,因此返回上一个位置的唯一方法是使用鼠标滚轮。 enter image description here

在水平方向滚动时(通过按住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

1 个答案:

答案 0 :(得分:0)

作为现在的解决方法,我最终用常规网格替换了scrollview控件,并添加了我自己的ScrollBar控件(垂直和水平)。这使我能够根据我的要求定制他们的行为。