UWP Offset GridView Полоса прокрутки - PullRequest
0 голосов
/ 06 мая 2019

Я делаю Gridview, который прокручивает позади элемента заголовка (который полупрозрачен, чтобы показать элементы, прокручиваемые позади него). Для этого я наслоил Grid, содержащий заголовок, и GridView, поместив их обоих в качестве дочерних элементов в один и тот же Grid.

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

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

Это отлично работает, но заставляет GridView отображать элементы, изначально стоящие за заголовком. Чтобы это исправить, я сместил ItemsWrapGrid в GridView:

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

Теперь элементы начинаются так, как будто они находятся ниже содержимого заголовка, и прокручиваются под ним.

Единственная оставшаяся проблема - полоса прокрутки для GridView. Полоса прокрутки по-прежнему идет к верхней части родительского элемента Grid, что означает, что она идет за заголовком, даже если элементы в GridView начинаются под заголовком. Это особенно актуально, когда в GridView (строках) достаточно элементов, чтобы полоса прокрутки была достаточно маленькой, чтобы полностью скрываться за заголовком.

Есть ли способ смещения полосы прокрутки, аналогичный элементам GridView? Это неправильный подход?

1 Ответ

1 голос
/ 07 мая 2019

UWP Offset GridView Полоса прокрутки

По вашему требованию вы можете использовать VisualTreeHelper, чтобы получить VerticalScrollBar элемент, а затем установить Margin = 0,100,0,0 в обработчике событий загрузки GridView. Подробные инструкции приведены в следующем коде.

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

}
...