UWP 偏移 GridView 滚动条

UWP Offset GridView Scrollbar

我正在制作一个在标题元素后面滚动的 Gridview(它是半反式parent 以显示在其后面滚动的项目)。为此,我将包含标题的 GridGridView 分层,将它们都作为 children 放在同一个 Grid.

<Grid>
    <GridView>
        <!-- Stuff -->
    <GridView>

    <Grid Height="100">
        <!-- Title Content here -->
    </Grid>
</Grid>

这工作正常,但会导致 GridView 显示最初位于标题后面的元素。为了解决这个问题,我在 GridView:

中偏移了 ItemsWrapGrid
<GridView.ItemsPanel>
    <ItemsPanelTemplate>
        <ItemsWrapGrid Name="ItemsWrapGrid"
                       Margin="0,100,0,0"
                       Orientation="Horizontal"
                       HorizontalAlignment="Center"></ItemsWrapGrid>
    </ItemsPanelTemplate>
</GridView.ItemsPanel>

现在项目开始时好像在标题内容下方,并在其下方滚动。

唯一剩下的问题是 GridView 的滚动条。滚动条仍然位于 parent Grid 的顶部,这意味着它位于标题后面,即使 GridView 中的项目本身开始于标题下方。当 GridView(行)中有足够多的项目导致滚动条足够小以至于完全位于标题后面时,这尤其是一个问题。

有没有办法像 GridView 项目那样偏移滚动条?这是错误的做法吗?

UWP Offset GridView Scrollbar

根据您的要求,您可以使用 VisualTreeHelper 获取 VerticalScrollBar 元素,然后在 GridView 加载事件处理程序中设置 Margin = 0,100,0,0。详细步骤请参考以下代码

public static DependencyObject MyFindGridViewChildByName(DependencyObject parant, string ControlName)
{
    int count = VisualTreeHelper.GetChildrenCount(parant);

    for (int i = 0; i < count; i++)
    {
        var MyChild = VisualTreeHelper.GetChild(parant, i);
        if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
            return MyChild;

        var FindResult = MyFindGridViewChildByName(MyChild, ControlName);
        if (FindResult != null)
            return FindResult;
    }

    return null;
}


private void TestGridView_Loaded(object sender, RoutedEventArgs e)
{
    var scrollBar = MyFindGridViewChildByName(TestGridView, "VerticalScrollBar");

    scrollBar.SetValue(MarginProperty, new Thickness(0, 100, 0, 0));

}