无法在WPF中完全样式化ListBox/ScrollViewer

12
我正在使用我们创建的标准ControlTemplates来使用自定义滚动条,但是当我将它们应用于ListBox时,底部右侧有一个角落我无法找到任何方法覆盖它。
不幸的是,在我获得更多积分之前,我无法发布图片。但是,我所指的角落是当垂直和水平滚动条都出现时,底部右侧会有一个填充着浅灰色的空间,我无法覆盖它。

你能添加你的模板代码吗?这可能会有助于回答问题。 - Chris Nicol
3个回答

11

这是我从Blend中获取的ScrollViewer模板代码的一部分。我在右下角添加了一个矩形,并将Fill属性设置为红色。您可以以相同的方式对其进行样式设置,或者您可以扩展其中一个ScrollBar来覆盖该空间,使用Grid.RowSpan="2"来覆盖垂直滚动条(第一个),或使用Grid.ColumnSpan="2"来覆盖水平滚动条(第二个)。

<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
它确实能工作。但我碰巧发现执行性能呈线性显著下降。展示7000个项目(相对简单且轻量级的项目)以前只需要1-2秒,但采用这种方法可能需要15-19秒。我想知道渲染性能的瓶颈在哪里。 - Haiyuan Li

1

另外两种解决方案也可行。

1) 矩形颜色是动态的,使用关键字"SystemColors.ControlBrushKey"。您可以在自定义样式或ScrollViewer控件(或其祖先之一)的资源中覆盖此关键字。来源: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的样式设置为“Hidden”(与上面相同的位置)。警告:如果矩形包含在控件的子级中,这将产生副作用。

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

0

可能有两个方面可以帮助你:

1)使用Snoop来探索应用程序的元素树,这可能有助于找到问题所在。

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

希望这能帮到你。


实际上,我是从标准列表框的副本开始的(使用Blend提取模板)。 - DJScrib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接