【问题标题】:Metro app - How to scroll to a particular control in StackPanelMetro 应用程序 - 如何滚动到 StackPanel 中的特定控件
【发布时间】:2012-08-27 10:30:29
【问题描述】:

在我的 C# windows 8 Metro 应用程序中,我在 ScrollViewer 之上添加了一个 StackPanel。我在 StackPanel 上水平添加了一些控件。在 StackPanel 上添加所有控件后,我想滚动到特定控件并显示该控件(将焦点设置到特定控件)。

请告诉我这样做是否可行。我查看了 ScrollViewer 类参考,有一个名为 ScrollToHorizo​​ntalOffset 的方法,但我不知道如何获取添加到 StackPanel 上的特定控件的偏移量。

StackPanel 中没有这样的方法返回它的孩子的偏移量。

【问题讨论】:

  • 你能发布你的尝试吗? 这当然是可能的。
  • 我尝试获取添加到 StackPanel 上的控件的偏移值,但没有找到任何相关的 API 方法。如果您知道任何获取偏移量的方法,请告诉我。

标签: c# windows-phone-7 windows-8 microsoft-metro windows-runtime


【解决方案1】:

如果可能,我建议您查看类似 ListView 的内容,因为它允许您滚动到列表中的特定项目。但是,如果这不可行,你可以做这样的事情......

function scrollTo(int childIndex)
{
            double offset = 0;
            for (int i = 0; i < childIndex; i++)
            {
                var element = stack.Children[1] as FrameworkElement;
                offset += element.ActualWidth + element.Margin.Left + element.Margin.Right;
            }

            if (offset > scroll.ActualWidth)
                scroll.ScrollToHorizontalOffset(offset - scroll.ActualWidth);
            else
                scroll.ScrollToHorizonalOffset(0);
}

scroll 是您的滚动查看器,stack 是您的堆栈面板。假设水平布局。这只会将项目带入滚动窗口,不会将其滚动到最左边缘,因为这并不总是可能的。

【讨论】:

  • 我也想过这样做。但我预计会有任何简单的 API 方法调用来执行此操作,这样我们就可以避免遍历堆栈面板子项。谢谢。
  • @saikamesh 我相信在 WPF 中有 API 调用可以做到这一点。不知道为什么他们在 Windows 8 UI 中没有它们。
【解决方案2】:

堆栈面板根据控件请求的空间量来布置控件,因此您可以通过遍历控件之前的所有子控件并计算每个控件占用的空间来计算偏移量。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多