使垂直嵌套滚动始终可见

时间:2013-03-22 15:01:10

标签: c# wpf scroll

我有以下Xaml。我有一个包含一些"列标题的网格"和一个列表框。目前我的水平滚动条滚动列标题和列表框。我的垂直滚动条只滚动列表框,因为我想要列标题"冻结"。我的问题是我必须向右滚动才能看到垂直滚动条。无论如何都有"锁定"垂直滚动条始终可见(当需要时)并且只能滚动列表框?如果您需要更多信息,请告诉我。

<Grid Name="test1" Margin="0,0,50,0" Grid.Row="0">
    <ScrollViewer  VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" Width="{Binding ElementName=test1, Path=ActualWidth}">
        <Grid Name="grdMain"  >
            <Grid.RowDefinitions>
                <RowDefinition Height="10*" />
                <RowDefinition Height="90*" />
            </Grid.RowDefinitions>
                <StackPanel Grid.Row="0">
                    <ItemsControl  Name="ColumnHeaders" ..>
                    </ItemsControl>
                </StackPanel>
                <StackPanel Name="check" Grid.Row="1">
                    <ScrollViewer Height="{Binding ElementName=check, Path=ActualHeight}"  VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Hidden">
                        <ListBox   Name="lstDrop" ..>
                        </ListBox>
                    </ScrollViewer>
                </StackPanel>
            </Grid>
         </ScrollViewer>
                </Grid>

以下是当前功能的屏幕截图:

Scrolling without bar visible

Scrolling with bar visible

1 个答案:

答案 0 :(得分:0)

最后,我想的有点吵闹。不过,这里有一些东西。我不得不对最初的想法和你的布局做一些改变,但之后它看起来都是一样的。

<Grid Name="test1" Margin="0,0,50,0" Grid.Row="0">
    <Grid Name="grdMain"  >
        <Grid.RowDefinitions>
            <RowDefinition Height="10*" />
            <RowDefinition Height="90*" />
        </Grid.RowDefinitions>
        <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" Name="scv_headers">
            <ItemsControl Name="ColumnHeaders">
                <!--Headers here-->
            </ItemsControl>
        </ScrollViewer>

        <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" ScrollChanged="List_OnScrollChanged">
            <ListBox Name="lstDrop">
                <!--Items here-->
            </ListBox>
        </ScrollViewer>
    </Grid>
</Grid>

由于滚动条隐藏在模板中,我不得不在

后面添加一些代码
    private void List_OnScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        var scrollbarSrc = (ScrollBar)((ScrollViewer)e.OriginalSource).Template.FindName("PART_HorizontalScrollBar", (ScrollViewer)e.OriginalSource);

        scv_headers.ScrollToHorizontalOffset(scrollbarSrc.Value);
    }

因为你的堆叠面板只包含一个项目,所以我将它们放在一边,看起来几乎一样。