偏移列标题会留下背景显示的空间

时间:2015-10-14 11:30:19

标签: c# wpf datagrid visual-studio-2015

我有一个使用多种组样式的数据网格。除了一个问题外,这种方法效果非常好。

列标题偏离了数据列,因为我在组样式中使用了扩展器和其他项容器。

我使用以下代码解决了这个问题:

public class Test {

    private InputData inputdata;

    private ClassUnderTest classUnderTest;

    final List<ItemData> allData = new ArrayList<ItemData>();

    @Mock
    private DeliveryItemData item1;

    @Mock
    private DeliveryItemData item2;



    @Mock
    private SomeService myService;


    @Before
    public void setUp() throws Exception {
        classUnderTest = new ClassUnderTest();
        myService = mock(myService.class); 
        classUnderTest.setService(myService);
        item1 = mock(DeliveryItemData.class);
        item2 = mock(DeliveryItemData.class);

    }


    @Test
    public void test_sort() {
        createData();
        when(myService.getListWithData(inputdata).get().getItemDatas());

        when(item1.hasSomething()).thenReturn(true);
        when(item2.hasSomething()).thenReturn(false);

    }

    public void createData() {
        item1.setSomeValue("val");
        item2.setSomeOtherValue("test");

        item2.setSomeValue("val");
        item2.setSomeOtherValue("value");

        allData.add(item1);
        allData.add(item2);


}

这非常有效,但我知道有一个小但同样令人恼火的问题,即列标题偏移,在最左边的标题区域留下一个小区域,背景显示

enter image description here

如何扩展最左侧的列标题以覆盖此空间?

在类似的情况下,当滚动条出现时,滚动条上有一个类似的间隙,我认为这可能是一个类似的问题

enter image description here

1 个答案:

答案 0 :(得分:0)

  1. 左边的边距是由DataGridRowHeaderStyle
  2. 引起的

    我将其设置为绿色以使其可见

    Datagrid with border

    <Style x:Key="DataGridRowHeaderStyle1" TargetType="{x:Type DataGridRowHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                    <!-- I set Width to 50 to make border visible. Set Width="0" to make it disappear -->
                        <Border BorderThickness="1" BorderBrush="Green" Width="50" >
    

    这里使用DataGridRowHeaderStyle1:

    <DataGrid x:Name="datagridPersons"  
              RowHeaderStyle="{DynamicResource DataGridRowHeaderStyle1}" >
    

    (注意:要创建DataGridRowHeaderStyle:右键单击datagrid /编辑其他模板/编辑DataGridRowHeaderStyle /创建副本)

    要使保证金消失,

    将宽度设置为0,如上面的XAML注释所示,边距消失

    1. 当数据分组时,会再出现更多边距。
    2. Datagrid, grouping, visible margins

      使用Visual Studio查看可视树,您会看到:

      Visual tree, debugging with Visual studio

      这是有罪的!

      (为了看到这一点,在图形回调中设置断点,观察this或对数据网格的引用。 然后在调试器中单击放大镜

      Watching Visual tree in Visual studio debugger

      我找到的唯一解决方案是在可视化树中搜索有罪的ItemsPresenter并将其边距设置为0

      最后一个问题是GroupItems是使用项目演示者动态创建的。

      因此,添加GroupItems时需要删除边距。 所以我订阅了CollectionViewSource分组事件

      viewSource.View.GroupDescriptions.CollectionChanged += View_CollectionChanged;
      
      
      async void View_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
      {
          // later ...
          await Task.Delay(100);
          RemoveMargins();
      }
      private void RemoveMargins()
      {
          // For FindAllVisualDescendants() function, see my answer to that question : 
          // http://stackoverflow.com/questions/32736265/datagrid-templatecolumn-update-source-trigger-explicit-only-updates-first-row/32741477#32741477
          var allItemsPresenter = datagridPersons.FindAllVisualDescendants()
              .OfType<ItemsPresenter>()
              .Where(elt => elt.Name == "ItemsPresenter")
              .Where(elt => elt.Margin == new Thickness(5, 0, 0, 0));
      
          foreach (var itemsPresenter in allItemsPresenter)
          {
              itemsPresenter.Margin = new Thickness(0, 0, 0, 0);
          }
      }
      

      我必须让它异步。

      这样,它起作用:

      Datagrid without border on Grouped Items

      以下是完整代码:

      http://1drv.ms/1VXx9qb

      最佳编码