2012-11-19 2 views
6

양식의 DataGrid를 사용하여 (사용자 ID, 이름, 잔액 등) 목록을 표시합니다. 매우 이상한 문제가 있습니다. 일부 행 (매우 20 행 중 하나)의 시작 부분에 행이 정렬되지 않는 작은 공백이 있습니다. 공백은 행의 첫 번째 셀 바로 앞에있는 작은 직사각형과 같습니다. 나는 내 스타일과 모든 것을 리뷰했지만 왜 이런 일이 일어나는지 알 수 없다. 이것은 프로그래밍 방식으로 DataGrid를 스크롤 할 때만 발생합니다. 스크롤이 완료되면 공백이 나타납니다.WPF DataGrid 행 가로 맞춤 문제

더 나쁜 것은 공백 크기를 조정할 수 있다는 것입니다. 내 마우스로 크기를 조정하면 그리드가 위로 올라갑니다. 나는 이처럼 뭔가를 발송하고 싶지 않습니다.

WPF에서 많은 경험이 없지만 누군가가 내게 어디서 볼 것인지 생각해볼 수 있다면 정말 감사 할 것입니다. 감사.


편집 : 여기 스크린 샷입니다 : 나는 여러 프로젝트에서 같은 문제를 경험했던

enter image description here

+1

스크린 샷과 코드를 게시 할 수 있습니까? WPF Snoop과 같은 도구를 사용하면 무슨 일이 일어나는지 파악할 수 있습니다. –

+0

위대한 도구! 이제 저는이 객체를 어떤 유형의 객체인지 알아 내기 위해이 객체를 사용하고 있습니다! – DeveloperInToronto

답변

7

이 문제는 임의의 행에 대해 "표시되는"행 머리글 때문에 발생합니다.

왜 그런지는 잘 모르겠지만 다행스럽게도 수정 사항은 간단합니다.

DataGrid에 RowHeaderWidth="0"을 설정하면 예상대로 동작해야합니다.

HeadersVisibility이 Column으로 설정된 경우에도 행 머리글이 여전히 모양을 나타냅니다.

+0

많은 감사합니다 피터! 넌 나를 구했다! 나는 내가 틀린 일을했다고 생각했고 지난 2 일 동안 내가 가진 xaml과 C# 코드의 모든 단일 행을 살펴 보았다. 그러나 나는 아무것도 찾을 수 없었다! 이상한 버그! – DeveloperInToronto

+1

필자의 경우,이 동작은 IDataErrorInfo 유효성 검사가 빨간색 느낌표를 허용하도록 기본 RowHeader 너비를 약간 늘리면 발생합니다 (오류가있는 행에만 해당). 'RowHeaderWidth = "11"'을 설정하면, 그것은 일정하게 유지되고 문제는 사라집니다. – Heliac

0

는, 지금까지 내가 말할 수있는, 그냥 일반 OLE 버그입니다. 절름발이입니다. 내가 찾은 유일한 일은 절름발이 다. 슈퍼처럼, 슈퍼 절름발이. 나는 더 나은 것이 있었으면 좋겠지 만, 나는 그렇지 않습니다. 어쨌든, 그리드의 크기를 조정하면 이상한 스크롤 아티팩트가 사라질 것이므로 레이아웃을 업데이트하기 위해 엔진을 트리거하는 코드를 작성했습니다.

Timer _timer; 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    _timer = new Timer(1000); 
    _timer.Elapsed += _timer_Elapsed; 
    _timer.Start(); 
} 

void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    //why the hell are we doing this? 
    //well, the stupid error adorners on the grid like to be mis-aligned 
    //forcing a layout to happen makes them not look off. lame, I know. 
    Dispatcher.Invoke(new Action(() => 
    { 
     MainDataGrid.Margin = new Thickness(MainDataGrid.Margin.Left, MainDataGrid.Margin.Top, MainDataGrid.Margin.Right, MainDataGrid.Margin.Bottom + 1); 
     MainDataGrid.UpdateLayout(); 

     MainDataGrid.Margin = new Thickness(MainDataGrid.Margin.Left, MainDataGrid.Margin.Top, MainDataGrid.Margin.Right, MainDataGrid.Margin.Bottom - 1); 
     MainDataGrid.UpdateLayout(); 
    })); 


}