Можно ли остановить вертикальную полосу прокрутки от смещения столбцов / заголовков DataGrid влево? - PullRequest
8 голосов
/ 23 февраля 2012

Можно ли остановить вертикальную полосу прокрутки от толкания столбцов / заголовков DataGrid влево?(См. Рисунок)

В качестве альтернативы, возможно ли стилизовать небольшую обведенную область, чтобы она не просто отображалась в виде белого квадрата?

Ответы [ 3 ]

6 голосов
/ 30 января 2013

Пожалуйста, используйте следующий шаблон (ColumnSpan делает трюк):

        <Style x:Key="{x:Type DataGridColumnHeadersPresenter}" TargetType="{x:Type DataGridColumnHeadersPresenter}">
            <Setter Property="Grid.ColumnSpan" Value="2" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
                        <Grid>
                            <DataGridColumnHeader IsHitTestVisible="False" Name="PART_FillerColumnHeader"/>
                            <ItemsPresenter/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
2 голосов
/ 23 февраля 2012

Цвет этого прямоугольника над полосой прокрутки является свойством Background объекта DataGrid. Так, например, если вы хотите сделать его желтым, вы можете установить

<DataGrid Background="Yellow" ...

Недостатком этого (потенциально) является то, что фон затем влияет на всю вашу DataGrid, включая любое пространство, не занимаемое строками данных:

enter image description here

Одним из решений, если вы хотите, чтобы рассматриваемый прямоугольник был желтым, а не пространство под строками данных, могло бы быть создание пользовательской кисти, которая отображала желтый цвет для полосы той же ширины, что и заголовки столбцов, и белый цвет для остальное.

0 голосов
/ 23 февраля 2012

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

Определения столбцов определены в ресурсах:

 <UserControl.Resources>
    <ResourceDictionary>
        <GridViewColumnCollection x:Key="siColumnCollection">
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        ...
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
                <GridViewColumnHeader Content="Fish"/>
            </GridViewColumn>
    ...

Затем заголовки и представление списка представлены отдельно, оба ссылаются на один и тот же ресурс:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <GridViewHeaderRowPresenter Columns="{StaticResource siColumnCollection}"/>
    <ListView Grid.Row="1" ItemsSource="{Binding ViewModelList}">
        <ListView.Resources>
            <DataTemplate x:Key="siNormalRowTemplate">
                <GridViewRowPresenter Columns="{StaticResource siColumnCollection}"/>
            </DataTemplate>
        </ListView.Resources>
    </ListView>
</Grid>

(я не могу обещать, что этот XAML работает точно так, как написано, но дает вам идею).

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

Редактировать : это решение работает, если у вас есть GridView, но, к сожалению, не работает дляDataGrid.Я не вижу эквивалентного способа разделения заголовка и строк в DataGrid, поэтому этот ответ будет работать только в том случае, если вы готовы поменять DataGrid на GridView.Извините!

...