Прокрутите новый объект в ItemsControl в представление

В данный момент я не знаю, что любой встроенный метод делает это, но это не трудно, я делаю это как это:

  • Мы должны получить Корневой каталог приложения и заменить его в нашем новом пути с ~
  • , Мы должны преобразовать обратные косые черты в наклонные черты
<час>
public string ReverseMapPath(string path)
{
    string appPath = HttpContext.Current.Server.MapPath("~");
    string res = string.Format("~{0}", path.Replace(appPath, "").Replace("\\", "/"));
    return res;
}
7
задан H.B. 22 January 2012 в 04:12
поделиться

1 ответ

Я думаю, вам нужно вызвать BringIntoView в контейнере элементов, а не в самом ItemsControl:

var container = DocumentElements.ItemContainerGenerator.ContainerFromItem(model) as FrameworkElement;
if (container != null)
    container.BringIntoView();

РЕДАКТИРОВАТЬ: на самом деле это не работает, потому что на данный момент контейнер элементов не был сгенерировано еще ... Возможно, вы могли бы обработать событие StatusChanged в ItemContainerGenerator . Я попробовал следующий код:

public static class ItemsControlExtensions
{
    public static void BringItemIntoView(this ItemsControl itemsControl, object item)
    {
        var generator = itemsControl.ItemContainerGenerator;

        if (!TryBringContainerIntoView(generator, item))
        {
            EventHandler handler = null;
            handler = (sender, e) =>
            {
                switch (generator.Status)
                {
                    case GeneratorStatus.ContainersGenerated:
                        TryBringContainerIntoView(generator, item);
                        break;
                    case GeneratorStatus.Error:
                        generator.StatusChanged -= handler;
                        break;
                    case GeneratorStatus.GeneratingContainers:
                        return;
                    case GeneratorStatus.NotStarted:
                        return;
                    default:
                        break;
                }
            };

            generator.StatusChanged += handler;
        }
    }

    private static bool TryBringContainerIntoView(ItemContainerGenerator generator, object item)
    {
        var container = generator.ContainerFromItem(item) as FrameworkElement;
        if (container != null)
        {
            container.BringIntoView();
            return true;
        }
        return false;
    }
}

Однако он тоже не работает ... по какой-то причине ContainerFromItem по-прежнему возвращает значение null после изменения статуса на ContainersGenerated , а у меня нет идея почему: S


РЕДАКТИРОВАТЬ: Хорошо, теперь я понимаю ... это было из-за виртуализации: контейнеры генерируются только тогда, когда их нужно отобразить, поэтому контейнеры для скрытых элементов не создаются.

5
ответ дан 7 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

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