C#에서 Silverlight ListBox의 스크롤 위치를 동적으로 변경하고 C#에서 ListBox 컨트롤의 ScrollViewer 요소에 액세스하는 방법을 알아야합니까?Silverlight/C#에서 ListBox 컨트롤의 ScrollViewer 요소에 어떻게 액세스합니까?
고마워, 제프
C#에서 Silverlight ListBox의 스크롤 위치를 동적으로 변경하고 C#에서 ListBox 컨트롤의 ScrollViewer 요소에 액세스하는 방법을 알아야합니까?Silverlight/C#에서 ListBox 컨트롤의 ScrollViewer 요소에 어떻게 액세스합니까?
고마워, 제프
좋은 질문입니다. 직접 할 방법을 찾지 못했지만 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;
:리스트 박스 클래스에서 상속하는 클래스 내에서
, 당신은 보호 GetTemplateChild()를 사용할 수 있습니다 속성은 상속을 통해 다시 작동해야합니다.
경고 : 사용자 정의 템플릿을 설정 한 경우이 Scrollviewer가 없을 수 있습니다. 위의 방법에서 "ScrollViewer"대신 Scrollviewer 템플릿 템플릿을 사용할 수 있습니다. 더 datasourse이 목록 상자로 설정하면
ScrollViewer scrollViewer = yourListBox.getScrollHost();
가 null, 내 경우에는 제대로 UI 요소는 코드가
myListBox.ItemsSource = list;
을 실행 후에 만 다음은 호출 할 수 있습니다 반환 :
myListBox.ApplyTemplate();
것은 강제로 ListBox 시각적 트리를 만들지 않으면 GetTemplateChild()는 immediatly에 액세스하려고하면 Null을 반환합니다.
"Erno de Weerd"설명과 잘 어울립니다 : ListBox를 상속하여 GetTemplateChild() 메서드를 호출 할 수 있습니다.
나는 또한 시도 :
엠마누엘 (실버 라이트 3)
당신이에서 ScrollViewer 컨트롤을 찾을 수 있습니다,의는 ... 쉽게 당신의 목록 상자 템플릿에서 을 만들어 보자. 로드 된 메서드를 추가하면 보낸 사람 arg가 자동으로 생성됩니다.
private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
myScrollViewer = (sender as ScrollViewer);
}
이
GetTemplateChild가 보호 된 방법으로 보여줍니다 나를 위해 작동합니다. 그거 새로운가요? 왜냐하면 이제는 당신의 솔루션이 더 이상 작동하지 않을 것 같기 때문입니다. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –
잘 모르겠지만 상속 클래스. 이것은 내가 올바르게 기억한다면 결국 내가 한 일이다. 그것은 어쨌든 사용자 정의 목록보기였습니다. – Dann
이것은 실제로 작동하지 않으므로 시도해서는 안됩니다. GetTemplateChild는 보호 된 메서드입니다. – Kevin