Как Вы получаете доступ к элементу ScrollViewer управления ListBox в Silverlight/C#?

Документирование юнит-тестов не является подходящим и понятным способом. Проще говоря, я бы предпочел создать эффективные наборы тестов вместе с довольно четкими объяснениями, чтобы избежать какой-либо конкретной документации в тестах. После этого наборы тестов будут напоминать полную документацию, и они также расскажут о том, что делает текущий метод.

Вот пример, демонстрирующий вышеописанное с помощью Jest:

desscribe('<ComponentName />', () => {
   describe('button click', () => {
      it('calls exampleFunction', () => {
         expect(exampleFunction).toHaveBeenCalled();
      });
   });
});

Я не эксперт по интеграционному тестированию, но если вы действительно хотите остаться в курсе документирования ваших тестов страница jsdoc довольно проста для меня.

6
задан AnthonyWJones 22 November 2009 в 16:39
поделиться

4 ответа

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

var myScrollviewer = myListBox.GetTemplateChild ("ScrollViewer") как ScrollViewer;

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

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

5
ответ дан 16 December 2019 в 21:47
поделиться

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

3
ответ дан 16 December 2019 в 21:47
поделиться
ScrollViewer scrollViewer = yourListBox.getScrollHost();

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

myListBox.ItemsSource = list;
-1
ответ дан 16 December 2019 в 21:47
поделиться

Вы можете вызвать:

myListBox.ApplyTemplate();

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

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

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

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

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

0
ответ дан 16 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: