Как получить доступ к элементу ScrollViewer элемента управления ListBox в Silverlight / C #? - PullRequest
6 голосов
/ 05 ноября 2008

Я хочу динамически изменить позицию прокрутки ListBox в Silverlight из C #, и мне нужно знать, как получить доступ к элементу ScrollViewer элемента управления ListBox из C #?

Спасибо, ребята, Джефф

Ответы [ 5 ]

5 голосов
/ 27 апреля 2009

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

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

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

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

3 голосов
/ 06 ноября 2008

Хороший вопрос. Я не нашел способа сделать это напрямую, но подошел довольно близко, посмотрев на проект элементов управления Silverlight (в некоторых классах они используют 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 защищен, так что вам все равно нужно будет создать собственный класс.

1 голос
/ 13 октября 2012

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

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

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

0 голосов
/ 03 февраля 2010

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

myListBox.ApplyTemplate();

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

Это хорошо работает в сочетании с объяснением " Erno de Weerd ": наследуйте ListBox для возможности вызова метода GetTemplateChild ().

Я тоже пробовал:

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

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

0 голосов
/ 30 ноября 2009
ScrollViewer scrollViewer = yourListBox.getScrollHost();

Ноль, если в списке не задан источник данных, в моем случае он возвращает корректно Элемент интерфейса только после выполнения кода ниже

myListBox.ItemsSource = list;
...