2008-11-04 1 views

ответ

3

Хороший вопрос. Я не нашел способ сделать это напрямую, но пришел довольно близко, посмотрев проект Silverlight Controls (они используют scrollviewer для элемента управления в некоторых классах). Вот как вы можете получить его, но это требует пользовательского LISTBOX:

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 защищен, поэтому вам все равно нужно создать собственный класс.

5

Изнутри класса, который наследует от класса ListBox, вы можете использовать Protected GetTemplateChild():

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

Если вы хотите получить доступ к этому из-за пределов ListBox, а затем подвергая ScrollViewer с помощью Имущество должно работать, снова через наследование.

CAVEAT: Если вы установили свой собственный шаблон, то этот Scrollviewer может не существовать. Вы можете использовать имя шаблона Scrollviewer вместо «ScrollViewer» в методе выше.

+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(); 

является недействительным, если нет datasourse не установлен в ListBox, в моем случае это вернуть правильно UI элемент только после того, как ниже код выполняется

myListBox.ItemsSource = list; 
0

Вы можете позвонить:

myListBox.ApplyTemplate(); 

, чтобы заставить визуальное дерево ListBox, которое будет создано, иначе GetTemplateChild() вернет Null, если вы попытаетесь получить к нему доступ немедленно.

Это хорошо работает в сочетании с «Erno de Weerd»: наследовать ListBox, чтобы иметь возможность вызвать метод GetTemplateChild().

Я также попытался:

  • использовать метод расширения ListBox «GetScrollHost()», но он никогда не работал для меня (даже после полной инициализацых страниц).
  • «FindName()», но это не сработало, даже когда я указал имя ScrollViewer в шаблон ListBox.

Эммануэль (Silverlight 3)

1

Давайте сделаем это легко ... В шаблоне списка, вы можете найти управления ScrollViewer. Добавьте Loaded Method для него, и вы получите от него аргумент отправителя.

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

это работает для меня

Смежные вопросы