ScrollViewer的预留空间

Gol*_*cks 6 c# wpf wpf-controls

我有一个ScrollViewer圆形控件和

<ScrollViewer VerticalScrollBarVisibility="Auto">
   ...some controls here...
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

默认情况下,它不会保留显示滚动条所需的空间.这意味着当它显示/隐藏时,我的控件会被挤压并再次展开.

如何为滚动条保留空间?是否有某种属性或风格我可以设置,这意味着当它不需要它被设置为隐藏而不是崩溃?或者我的孩子控制器需要在右手边有"填充物"或其他东西来留下空间吗?我应该将控件放在网格中,并使滚动条的滚动条显示在(以某种方式)?

我希望它在不需要时仍然是隐形的我只是想让它保留空间的最佳方式.

谢谢大家.

pus*_*raj 9

这是一个样本

这将通过使用边框作为占位符来保留滚动条空间

    <ScrollViewer VerticalScrollBarVisibility="auto" x:Name="scroll">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="auto" />
            </Grid.ColumnDefinitions>
            <Border Background="LightGoldenrodYellow"
                    Height="300" />
            <Border Grid.Column="1"
                    Width="{x:Static SystemParameters.VerticalScrollBarWidth}">
                <Border.Style>
                    <Style TargetType="Border">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ComputedVerticalScrollBarVisibility, ElementName=scroll}"
                                         Value="Visible">
                                <Setter Property="Visibility"
                                        Value="Collapsed" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
        </Grid>
    </ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

第一个边框是内容,第二个边框是占位符,用于保留滚动条的空间.您可以选择替换您选择的元素

定义为可重用的模板

<Grid>
    <Grid.Resources>
        <ControlTemplate x:Key="ReservedSpaceScroller" TargetType="ContentControl">
            <ScrollViewer VerticalScrollBarVisibility="auto"
                          x:Name="scroll">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition Width="auto" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter />
                    <Border Width="{x:Static SystemParameters.VerticalScrollBarWidth}"
                            x:Name="placeholder" Grid.Column="1" />
                </Grid>
            </ScrollViewer>
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding ComputedVerticalScrollBarVisibility, ElementName=scroll}"
                             Value="Visible">
                    <Setter TargetName="placeholder"
                            Property="Visibility"
                            Value="Collapsed" />
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Grid.Resources>

    <ContentControl Template="{StaticResource ReservedSpaceScroller}">
        <Border Background="LightGoldenrodYellow"
                Height="300" />
    </ContentControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)

结果

结果