无法在WPF中完全设置ListBox / Scrollviewer的样式

时间:2009-12-22 07:06:16

标签: wpf listbox scrollbar scrollviewer

我正在使用我们使用标准ControlTemplates创建的自定义Scrollbars,但是当我将它们应用到ListBox时,右下角有一个角落,我无法找到任何覆盖方式。

不幸的是,在我获得更多积分之前,我无法发布图片。但我指的是当垂直和水平滚动条都出现的时候,右下方有一个空间,里面充满了一种灰白色的颜色,我无法再去除

3 个答案:

答案 0 :(得分:10)

这是我使用Blend为ScrollViewer获取的模板代码的一部分。我在右下角添加了一个矩形,并将填充设置为红色。您可以使用相同的方式设置样式,也可以使用Grid.RowSpan =“2”表示VerticalScrollBar(第一个)或Grid.ColumnSpan =“2”表示Horizo​​ntalScrollBar(第二个),以扩展其中一个ScrollBar以覆盖空间。 / p>

<Style TargetType="{x:Type ScrollViewer}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollViewer}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <ScrollContentPresenter Grid.Column="0"/>
                    <ScrollBar Name="PART_VerticalScrollBar" Grid.Row="0" Grid.Column="1" Value="{TemplateBinding VerticalOffset}" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
                    <ScrollBar Name="PART_HorizontalScrollBar" Orientation="Horizontal" Grid.Row="1" Grid.Column="0" Value="{TemplateBinding HorizontalOffset}" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
                    <Rectangle Grid.Row="1" Grid.Column="1" Fill="Red"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 1 :(得分:0)

可能会有所帮助的两件事:

1)使用Snoop探索应用程序的元素树,这可能有助于发现问题。

2)根据您启动控件的方式,您可以考虑从标准ListBox的副本开始。当我从空模板或部分模板开始样式时,我发现某些控件存在问题。

希望有所帮助

答案 2 :(得分:0)

还有另外两个解决方案。

1)矩形颜色是动态的,键为“ SystemColors.ControlBrushKey”。您可以用自定义样式或ScrollViewer控件(或其祖先之一)的资源覆盖此键。来源:this question on MSDN

示例:

<!-- In a style -->
<Style x:Key="MyCustomScrollViewer" TargetType="{x:Type ScrollViewer}">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/>
    </Style.Resources>
</Style>

<!-- Or in the control -->
<ScrollViewer>
    <ScrollViewer.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/>
    </ScrollViewer.Resources>
</ScrollViewer>

2)设置Rectangle的样式(与上面相同)并具有“隐藏”可见性。 警告:如果控件的后代中包含矩形,则会产生副作用。

<Style x:Key="MyCustomScrollViewer" TargetType="{x:Type ScrollViewer}">
    <Style.Resources>
        <!-- 'BasedOn' can be omitted -->
        <Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}">
            <Setter Property="Visibility" Value="Hidden"/>
        </Style>
    </Style.Resources>
</Style>