2009-03-18 5 views
7

WPF DataGrid이 있는데, 화면에서 볼 행이 너무 많을 때 세로 스크롤 막대가 생깁니다. 사용자가 스크롤 할 때 맨 위에 표시되는 행이 무엇인지 알 수있는 방법이 있는지 알고 싶습니다.WPF DataGrid에서 보이는 행을 확인하십시오.

이상적으로 나는 사용자가 스크롤 할 때 및 스크롤 할 때 어떤 정보를 업데이트하기 위해 맨 위의 표시 행이 무엇인지 확인하기 위해 이벤트를 연결하고 싶습니다.

답변

0

일종의 지나치게 복잡한 방법이지만, 효과가있을 수 있습니다. 먼저 DataGridRowsPresenter의 하위 클래스를 만들고 OnViewportOffsetChanged method을 재정의합니다. 그런 다음 DataGrid의 표준 컨트롤 템플릿을 복제하고 DataGridRowsPresenter를 자신의 것으로 대체하십시오. 뷰포트에 상대적인 행에 대한 히트 테스트의 세부 사항을 여러분에게 맡깁니다 ;-).

무엇을 구체적으로 달성하려고합니까? 우리는 더 부서지기 쉽고 번거로운 작업이 필요할 수 있으므로 더 좋은 방법을 찾아 낼 수 있습니다 (예 : 제어 템플릿을 업데이트하면 동기화되는 제어 템플릿 유지).

+0

감사합니다. 애니메이션을 사용하여 그리드 (주로 글꼴)의 크기를 조정하여 주위를 둘러 보았습니다. 아주 간단하지는 않지만 근본적으로 내가 원했던 것. –

+0

글꼴 크기를 조정할 때 글꼴 크기를 줄이면 열의 크기가 자동으로 조정되지 않아 더 큰 글꼴 크기의 너비가 유지된다는 문제가 발생했습니다. –

+0

WPFToolkit의 현재 빌드에는 자동으로 크기 조정 컬럼이 별 크기 컬럼과 혼합 될 때 이상하게 작동하는 버그가 있습니다. 우리는 그 행동을 보았고, 우리는 그것을 고치지 않았다. –

3

는 다음과 같은 방법은 나를 위해 일한 사용 :

// mHorizontalScrollBar is the HorizontalScrollBar subclass control's instance 

// Get the total item count 
nTotalCount = DataGrid1.Items.Count; 

// Get the first visible row index 
nFirstVisibleRow = mHorizontalScrollBar.Value; 

// Get the last visible row index 
nLastVisibleRow = nFirstVisibleRow + nTotalCount - mHorizontalScrollBar.Maximum; 
+0

@ 대니 벡캣 (DannyBeckett) 편집은 답을 완전히 쓸모 없게 만든다 (또는 잘 모르겠다.). 원래 대답으로 되돌아 간다. – Sinatr

+1

@Sinatr 나는 동의하지 않으며 귀하의 변경 사항을 취소했습니다. 여전히 동의하지 않으면 롤백 전쟁을 시작하는 대신 Meta Stack Exchange를 게시하십시오. –

+0

@DannyBeckett, 그것은 깨끗한 단계별 가이드 (나는 다소 나쁜 언어에 동의 함)와 나는 그 시간에 upvotes가 주어 졌다고 확신하기 전에. 나는 지금 같은 문제로 달린다. 그리고 현재의 상태에서이 대답을 시도 할 때 나는 그것이 작동하도록 만들고 심지어 그것을 downvoted하지 않는다. 그런 다음 수정 사항을 찾아 원래 답변을 읽습니다. 이는 더 명확합니다. 그대로 두자. 미래의 독자는 어쨌든 내 의견을 볼 수 있습니다 (그러나 모든 사람들이 내 문제가 아닌 수정 한 내용을 볼 수는 없습니다). – Sinatr

2

어떻게 데이터 그리드의에서 ScrollViewer에 ScrollViewer.ScrollChanged 이벤트에 가입 어떻습니까? 이벤트 인수는 ScrollViewer가 얼마나 이동했는지와 새로운 Vertical 오프셋이 무엇인지를 설명하는 꽤 광범위합니다. 또한 MSDN에 따라 :

CanContentScroll이 true 인 경우 ExtentHeight, ScrollableHeight, ViewportHeight 및 VerticalOffset 속성 값은 항목 수입니다. CanContentScroll이 false 인 경우 이러한 속성 값은 Device Independent Pixels입니다.

실제로 CanContentScroll은 DataGrid 용 ScrollViewer의 경우입니다. (: Finding control within WPF itemscontrol 여기처럼)

ScrollViewer scrollview = FindVisualChild<ScrollViewer>(dataGrid); 

여러 곳에서 찾아 볼 수있다 FindVisualChild의 구현을 사용하여 :

당신이 할 일은에서 ScrollViewer를 찾을 수 있습니다.

+0

이것은 실제로 훌륭하고 견고한 접근법입니다. – Gerard

0

검출 스크롤은 ScrollViewer에 인스턴스를 얻어야 쉽게 지금

<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" /> 

과 같습니다

void DataGrid_ScrollChanged(object sender, RoutedEventArgs e) 
{ 
    var scroll = FindVisualChild<ScrollViewer>((DependencyObject)sender); 
    ... 
} 

(안 어디에 있는지 FindVisualChild의 기원은,하지만 구현 거기에 많은 예를 들어 here를)

int firstRow = (int)scroll.VerticalOffset; 
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1; 
관련 문제