none
Как изменить толщину GridLines в DataGrid WPF? RRS feed

  • Вопрос

  • При переходе со старого доброго DataGridView (WinForms) на DataGrid (WPF) возник один неприятный момент.
    В DataGridView толщина линий сетки составляет 1 пиксель. Хочу добиться такого же поведения и в DataGrid.
    Однако, при размещении на форме DataGrid в первоначальном виде без всякой стилизации, каждая ячейка таблицы имеет свои внутренние границы что создаёт эффект более толстых линий сетки.

    Знатоки WPF, подскажите, пожалуйста, как установить толщину линий ровно в 1 пиксель?

    PS. Тестировал на  Win 7, Win 8 - эффект сохраняется.
    Эффект присутствует и в редакторе VisualStudio и в KAXAML.
    По всей видимости дело именно в самом элементе управления DataGrid.

    17 ноября 2016 г. 17:02

Ответы

  • Проблема решается установкой параметра RenderOptions.EdgeMode="Aliased"
    Данное решение подсказал David Kossoglyad за что ему большое спасибо!

    <DataGrid RenderOptions.EdgeMode="Aliased" UseLayoutRounding="True" ....>
    • Помечено в качестве ответа Kostey2204 28 ноября 2016 г. 13:41
    28 ноября 2016 г. 13:41

Все ответы

  • Здравствуйте,

    Попробуйте так:

    <Style TargetType="DataGridCell"> <Setter Property="BorderThickness" Value="0,1,0,1" />

    <Setter Property="BorderBrush" Value="Black"/> </Style>



    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.


    18 ноября 2016 г. 14:04
    Модератор
  • Здравствуйте, Максим! Спасибо за ответ.

    Попробовал как Вы посоветовали установить стиль Property="BorderThickness" Value="0,1,0,1", но это привело к тому что линии сетки стали ещё толще (см. рисунок).
    Попробовал установить толщину всех границ ячейки в ноль (Value="0,0,0,0"), но это приводит к исходному состоянию.

    18 ноября 2016 г. 16:21
  • Я так думаю не 0,1,0,1, а 0,0,1,1 ... 

    Впрочем, судя по картинке толщина вертикальной линии и так 1 px, только с анитиалиасингом. 

    Попробуйте установить UseLayoutRounding = true 

    https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.uselayoutrounding(v=vs.110).aspx

    Полезно так же помнить что пиксели в WPF (DIP) могут и не соответствовать пикселям на экране.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    18 ноября 2016 г. 17:03
    Модератор
  • Установка UseLayoutRounding = true помогла избавиться от антиалиасинга, но при таких значениях параметров
    BorderThickness="0,0,1,1" и BorderBrush="Black", линии сетки стали толщиной в 2 пикселя

    Добиться желаемого результата удалось с помощью установки BorderBrush="White".
    Финальная разметка:

    <DataGrid UseLayoutRounding="True" ....>
                <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="BorderThickness" Value="0,0,1,1" />
                        <Setter Property="BorderBrush" Value="White"/>
                    </Style>
                </DataGrid.CellStyle>
    18 ноября 2016 г. 19:47
  • Видимо это означает что сетка в 1 пиксел рисуется где то еще. Думаю есть собственно линии решетки. Установив еще и линиию вокруг ячеек вы их фактически слили вместе удвоив толщину.

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


    This posting is provided "AS IS" with no warranties, and confers no rights.

    18 ноября 2016 г. 23:30
    Модератор
  • Видимо это означает что сетка в 1 пиксел рисуется где то еще. Думаю есть собственно линии решетки. Установив еще и линию вокруг ячеек вы их фактически слили вместе удвоив толщину.

    Совершенно верно, они есть, причём можно отображать выборочно вертикальные или горизонтальные линии.
    GridLinesVisibility ("None", "Horizontal", "Vertical", "All"), а также настраивать их цвет.
         Моя цель как раз и состояла в том, чтобы показывать только линии решетки, а любые линии вокруг ячеек исключить.

      >Судя по всему по умолчанию линии вокруг ячейки нет, только элементы решетки. 

    По умолчанию отображаются все линии решетки черным цветом. Это точно. Насчет того есть ли по умолчанию линии вокруг ячейки, могу сказать следующее. Когда я устанавливал толщину границ ячеек в ноль ("BorderThickness" Value="0,0,0,0") , то высота строк становилась меньше. Всё же я предполагаю что граница по умолчанию есть и она равна ("BorderThickness" Value="1,1,1,1") может быть она прозрачная.

      >Так что наверное можно убрать все что касается стиля ячейки, сохранить лишь UseLayoutRounding.

    Убрав совсем все стили ячейки, и оставив лишь UseLayoutRounding="True" я вернулся к исходной проблеме (см. рисунок в 1-ом сообщении).

    19 ноября 2016 г. 8:00
  • Проблема решается установкой параметра RenderOptions.EdgeMode="Aliased"
    Данное решение подсказал David Kossoglyad за что ему большое спасибо!

    <DataGrid RenderOptions.EdgeMode="Aliased" UseLayoutRounding="True" ....>
    • Помечено в качестве ответа Kostey2204 28 ноября 2016 г. 13:41
    28 ноября 2016 г. 13:41