下面的代码应该将一个项目滚动到视图中,并将焦点设置到模板中的第一个子控件上:
lv.ScrollIntoView(lv.SelectedItem);
var lvi = lv.SelectedListViewItem();
//get the item's template parent
var templateParent = lvi.GetFrameworkElementByName<ContentPresenter>();
if (templateParent != null) <--but it's always null
{
var ctrl = templateParent.FindVisualChildren<FrameworkElement>().First();
ctrl.Focus();
}
问题在于,如果ListViewItem
不可见,则templateParent
为null,并且此代码不起作用。当然,此代码仅在尚不可见的情况下才有用。
是否可以将项目滚动到视图中,然后在其进入视图时得到通知?,以便模板为非空,以便执行ctrl.Focus()
代码?
答案 0 :(得分:0)
您可以处理RequestBringIntoView
事件。请参考以下示例代码。
public MainWindow()
{
InitializeComponent();
lv.ItemsSource = Enumerable.Range(1, 100);
lv.SelectedItem = 90;
lv.ScrollIntoView(lv.SelectedItem);
lv.RequestBringIntoView += Lv_RequestBringIntoView;
}
private void Lv_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
var container = lv.ItemContainerGenerator.ContainerFromItem(lv.SelectedItem);
if (container != null)
{
//...
}
}