C# WPF中的滚动视图器无法像Windows Store应用程序那样工作

5
我目前正在使用WPF开发一个应用程序。 我不禁注意到与Windows Store应用程序版本相比,ScrollViewer功能的差异。
当我处于屏幕边缘和ScrollViewer的边缘,并且我想滑动以使自己远离边缘时,我会看到Windows桌面或菜单栏(当在屏幕底部时)。 有没有解决方法可以防止这种滚动行为发生?当你滚动到屏幕边缘,然后被弹回并看到Windows平台下的一点内容时,这实在很烦人(也很丑!)。 Windows Store应用程序的ScrollViewer已经解决了这个问题。
我尝试重写ScrollChanged并检查例如horizontalOffset == 0 && horizontalChange < 0,如果是这种情况则返回。但是这个检查似乎不起作用(因为那时可能已经太晚了)。 而我似乎找不到Windows Store应用程序是如何解决这个问题的。
也许你们有什么想法?
编辑:.NET 4.5.1中WPF项目的重现
这段XAML在WPF中重新创建了我的问题。但是在Windows Store应用程序中,这个问题似乎不存在。
我如何防止滚动到我的应用程序的边缘和/或越过边缘时出现这种行为?
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" ResizeMode="NoResize" WindowState="Maximized" WindowStyle="None">
    <Grid>
        <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" PanningMode="Both">
            <Rectangle Height="2500" Stroke="Black" Width="3500" HorizontalAlignment="Left" VerticalAlignment="Top">
                <Rectangle.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0,0.5">
                        <GradientStop Color="#FF00FF68" Offset="0"/>
                        <GradientStop Color="Red" Offset="1"/>
                        <GradientStop Color="#FF95FF00" Offset="0.506"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
        </ScrollViewer>

    </Grid>
</Window>

你可以提供一下你所描述的行为的截图吗? - Dutts
@Richard 更新了澄清。您可以看到我的应用程序边缘。它会自动产生这个可怕的菜单栏。这两种行为都是不需要的,而且只会在WPF中发生,而不是Windows Store应用程序中。 - Totumus Maximus
啊,我明白你在说什么了。你的应用程序的WindowState属性值是多少? - Dutts
@Richard WindowsState = "最大化" -- ResizeMode = "不可调整大小" -- WindowStyle = "无边框" - Totumus Maximus
@Sheridan 这不是问题所在。这甚至不是任务栏的问题(我的操作系统上甚至没有自动隐藏)。WPF的ScrollViewer会在你滚动应用程序时显示这些内容。看看图像的左侧。你可以看到我的应用程序边缘和一个浅蓝色的条形(实际边缘),在它的左侧是我正在使用的Windows桌面的一部分。 - Totumus Maximus
显示剩余3条评论
1个回答

8
这是与滚动相关的默认Windows 8行为。当触及可滚动视图的边缘时,整个应用程序都会“弹跳”。这在每种情况下都会发生,并且是系统动画的一部分。例如,在Windows资源管理器中查看长列表文件夹时,您可以看到它。仅在通过触摸滚动时才会发生此情况,并且如果我记得正确,仅在非全屏应用程序中才会发生。我目前无法访问Windows 8机器以测试此说法,并且可能没有办法禁用此行为。
现代环境是完全独立的应用程序环境,根本不以相同的方式处理触摸手势。这就是为什么WinRT应用程序中不存在此行为的原因。
编辑:此效果称为操作边界反馈。当操作事件超出其容器限制时触发。您可以覆盖受影响的UIElement上的OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs)方法来禁用它,如下所示:
class NoTouchFeedbackWindow : Window
{
    protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
    {
        e.Handled = true;
    }
}

这也可以直接在你的ScrollViewer或任何上层控件上完成。

关于此行为,您可以在以下链接中找到更多信息:

希望这能解决您的问题。


嗯...所以你的意思是这可能根本无法解决。如果全屏应用程序和Windows7也有相同的行为,我可以确认这一点是否有助于复制。因此,它可能是他们解决触摸界面问题的第一个解决方案的遗留物。 - Totumus Maximus
我已经更新了答案,提供了关于该行为以及如何禁用它的更多信息。 - Etienne Maheu
这就是它!而且实现起来非常容易。你是怎么发现这个东西的? - Totumus Maximus
我偶然发现了这篇文章http://msdn.microsoft.com/en-us/magazine/gg232767.aspx,其中提到了“边界和反弹”这个术语,用于在处理惯性拖放时防止被操作的项移动到窗口外部。当我搜索“manipulation boundary wpf”时,第二个结果就给出了答案。如果不是因为这篇文章,我可能从未考虑过寻找这些关键词。 - Etienne Maheu
哈哈,我不会想出那个(否则这篇文章的需要就没有用了):D。我试图重现你的搜索后,不能轻易地回溯到你的答案。你确实做得非常好。 - Totumus Maximus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接