我正在尝试向我的应用添加滚动功能。基本上使用鼠标滚轮可以上下滚动,或者如果按住Shift键,则可以向左和向右滚动。
我创建了一个小样本应用程序来演示我遇到的问题。
我正在使用包含Canvas的ScrollViewer。我在画布上放置一个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
答案 0 :(得分:0)
作为现在的解决方法,我最终用常规网格替换了scrollview控件,并添加了我自己的ScrollBar控件(垂直和水平)。这使我能够根据我的要求定制他们的行为。