Не удается полностью создать ListBox/Scrollviewer в WPF

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

К сожалению, я не могу опубликовать фотографию, пока не получу больше очков. Но угол, о котором я говорю, - это когда появляется вертикальная и горизонтальная полоса прокрутки, в правом нижнем углу есть пробел, который заполняется не совсем белым цветом, который я не могу выполнить ovrerride

Ответ 1

Это часть кода шаблона, который я получил для ScrollViewer с помощью Blend. Я добавил прямоугольник в нижнем правом углу и установил Fill to Red. Вы можете настроить его таким же образом или вы можете расширить один из ScrollBar, чтобы покрыть пространство, используя Grid.RowSpan = "2" для VerticalScrollBar (первый) или Grid.ColumnSpan = "2" для HorizontalScrollBar (второй).

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

Ответ 2

Две вещи, которые могут помочь:

1) Используйте Snoop, чтобы изучить дерево элементов вашего приложения, это может помочь найти проблему.

2) В зависимости от того, как вы начали свой контроль, вы можете подумать о том, чтобы начать с копии стандартного списка ListBox. Я обнаружил проблемы с некоторыми элементами управления, когда начинаю стилинг с пустого или частичного шаблона.

надеюсь, что поможет

Ответ 3

Еще два решения работают.

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 со скрытой видимостью. Предупреждение: это будет иметь побочные эффекты, если прямоугольники содержатся в потомках элемента управления.

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