В данный момент я не знаю, что любой встроенный метод делает это, но это не трудно, я делаю это как это:
~
public string ReverseMapPath(string path)
{
string appPath = HttpContext.Current.Server.MapPath("~");
string res = string.Format("~{0}", path.Replace(appPath, "").Replace("\\", "/"));
return res;
}
Я думаю, вам нужно вызвать 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
РЕДАКТИРОВАТЬ: Хорошо, теперь я понимаю ... это было из-за виртуализации: контейнеры генерируются только тогда, когда их нужно отобразить, поэтому контейнеры для скрытых элементов не создаются.