2008-11-04 3 views

답변

3

좋은 질문입니다. 직접 할 방법을 찾지 못했지만 Silverlight Controls 프로젝트 (일부 클래스의 항목 컨트롤에 scrollviewer 사용)를 살펴보면 상당히 가까이에있었습니다. 여기 당신이 그것을 얻을 수있는 방법이지만, 사용자 지정 목록 상자가 필요합니다

public class TestBox : ListBox 
{ 
    private ScrollViewer _scrollHost; 

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     var itemsHost = VisualTreeHelper.GetParent(element) as Panel; 

     for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj)) 
     { 
      ScrollViewer viewer = obj as ScrollViewer; 
      if (viewer != null) 
      { 
       _scrollHost = viewer; 
       break; 
      } 
     } 

     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

당신의 템플릿을 보면, 해당 이벤트에 후크하는 또 다른 방법 (또는 패널을 얻을 수있는 다른 방법이)있을 수 있습니다 ListBox를 사용하면 스크롤 뷰어의 이름이 실제로 "ScrollViewer"로 표시되지만 GetTemplateChild 메서드는 보호되어 있으므로 사용자 지정 클래스를 만들어야합니다. 당신이 다음을 통해 ScrollViewer에 노출,리스트 박스 외부에서이 액세스하려면

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

:리스트 박스 클래스에서 상속하는 클래스 내에서

5

, 당신은 보호 GetTemplateChild()를 사용할 수 있습니다 속성은 상속을 통해 다시 작동해야합니다.

경고 : 사용자 정의 템플릿을 설정 한 경우이 Scrollviewer가 없을 수 있습니다. 위의 방법에서 "ScrollViewer"대신 Scrollviewer 템플릿 템플릿을 사용할 수 있습니다. 더 datasourse이 목록 상자로 설정하면

+0

GetTemplateChild가 보호 된 방법으로 보여줍니다 나를 위해 작동합니다. 그거 새로운가요? 왜냐하면 이제는 당신의 솔루션이 더 이상 작동하지 않을 것 같기 때문입니다. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –

+0

잘 모르겠지만 상속 클래스. 이것은 내가 올바르게 기억한다면 결국 내가 한 일이다. 그것은 어쨌든 사용자 정의 목록보기였습니다. – Dann

+0

이것은 실제로 작동하지 않으므로 시도해서는 안됩니다. GetTemplateChild는 보호 된 메서드입니다. – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

가 null, 내 경우에는 제대로 UI 요소는 코드가

myListBox.ItemsSource = list; 
0

을 실행 후에 만 ​​다음은 호출 할 수 있습니다 반환 :

myListBox.ApplyTemplate(); 

것은 강제로 ListBox 시각적 트리를 만들지 않으면 GetTemplateChild()는 immediatly에 액세스하려고하면 Null을 반환합니다.

"Erno de Weerd"설명과 잘 어울립니다 : ListBox를 상속하여 GetTemplateChild() 메서드를 호출 할 수 있습니다.

나는 또한 시도 :

  • 이 목록 상자 확장 방법을 사용하는 "GetScrollHost()"하지만 (심지어 전체 페이지 initialisations 후) 나를 위해 일하지 않았다.
  • "FindName()"하지만 ListBox 템플릿에 ScrollViewer 이름을 지정한 경우에도 작동하지 않았습니다.

엠마누엘 (실버 라이트 3)

1

당신이에서 ScrollViewer 컨트롤을 찾을 수 있습니다,의는 ... 쉽게 당신의 목록 상자 템플릿에서 을 만들어 보자. 로드 된 메서드를 추가하면 보낸 사람 arg가 자동으로 생성됩니다.

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myScrollViewer = (sender as ScrollViewer); 
    } 

관련 문제