【问题标题】:C# wpf scrollviewer not working like windows store appC# wpf scrollviewer 不像 Windows 商店应用程序那样工作
【发布时间】:2016-08-20 02:16:36
【问题描述】:

我目前正在使用 WPF 开发一个应用程序。 我不得不注意到 ScrollViewer 功能与 Windows Store App 变体相比的差异。

当我位于屏幕边缘和 ScrollViewer 的边缘时,我想滑动以便远离边缘。我看到 Windows 桌面或菜单栏(在屏幕底部时)。 是否有防止这种滚动行为发生的解决方案?当您滚动到屏幕边缘然后被撞回来并看到下面的一些 Windows 平台时,这相当烦人(而且丑陋!)。 此行为已在 Windows Store App ScrollViewer 中修复。

我尝试覆盖 ScrollChanged 并检查 f.e. horizontalOffset == 0 && horizontalChange < 0 并在这种情况下返回。但是这个检查似乎不起作用(从那时起可能已经太晚了)。 而且我似乎找不到 Windows 应用商店应用程序解决此问题的方法。

也许你们有什么想法?


编辑: 在 .NET 4.5.1 中复制 WPF 项目

这段 XAML 重新创建了我在 WPF 中的问题。但是在 Windows Store App 中,问题似乎并不存在。

当滚动到和/或越过应用程序的边缘时,如何防止这种行为?

<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>

【问题讨论】:

  • 您能否提供您描述的行为的屏幕截图?
  • @Richard 更新澄清。在左侧,您可以看到我的应用程序的边缘。它还会自动生成这个可怕的菜单栏。这两种行为都是不受欢迎的,并且都只发生在 WPF 中而不是 Windows 应用商店应用程序中。
  • 啊我明白你在说什么了,WindowState 对你的应用有什么价值?
  • @Richard WindowsState = "Maximized" -- ResizeMode = "NoResize" -- WindowStyle = "None"
  • @Sheridan 这不是这里的问题。问题甚至不是任务栏(它甚至不是我操作系统上的自动隐藏)。 WPF 的 ScrollViewer 会在您滚动应用程序时显示这些内容。查看图像的左侧。您会看到我的应用程序的边缘和一个浅蓝色条(实际边缘),左侧是我正在使用的 Windows 桌面(的一部分)。

标签: c# wpf scroll windows-store-apps scrollviewer


【解决方案1】:

这是与滚动相关的默认 Windows 8 行为。当点击可滚动视图的边缘时,您的整个应用程序将“弹跳”。这在每种情况下都会发生,并且是系统动画的一部分。例如,当您在一长串文件夹中时,您可以在 Windows 资源管理器中看到它。这只发生在通过触摸滚动时,如果我没记错的话,在非全屏应用程序上。我目前无法访问 Windows 8 机器来测试此声明并且很可能无法禁用此行为

Modern 环境是一个完全独立的应用程序环境,根本不会以相同的方式处理触摸手势。这就是 WinRT 应用程序中不存在此行为的原因。

EDIT:这种效果称为操纵边界反馈。当操作事件超出其容器的限制时触发。您可以通过覆盖受影响的UIElement 上的OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs) 方法来禁用它,如下所示:

class NoTouchFeedbackWindow : Window
{
    protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
    {
        e.Handled = true;
    }
}

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

您可以在以下位置找到有关此行为的更多信息:

希望这能解决您的问题。

【讨论】:

  • 嗯.. 所以你说这可能根本无法解决。如果这有助于复制,我可以确认全屏应用程序和 Windows7 的相同行为。所以这可能是他们第一个解决触摸界面问题的方法的残余。
  • 我已经更新了答案,提供了有关行为以及如何禁用它的更多信息。
  • 就是这样!事实证明它也很容易实现。你是怎么发现这件事的?
  • 我偶然发现了这篇文章msdn.microsoft.com/en-us/magazine/gg232767.aspx,它在处理惯性拖放时试图防止被操纵的项目移出窗口时使用了术语“边界和反弹”。答案在谷歌搜索“操纵边界 wpf”时的第二个结果中。如果不是因为这篇文章,我根本不会考虑去寻找那些关键词。
  • 哈,好吧,我不会想出这个(否则这篇文章的全部需求将毫无用处):D。在尝试重现您的搜索后,我不能说我可以轻松地回溯到您的答案。你确实做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多