首页 > 解决方案 > ListViewItem 滚动到视图中时的通知

问题描述

以下代码应该将项目滚动到视图中并将焦点设置到模板中的第一个子控件:

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则为空,并且此代码不起作用。当然,此代码仅在项目尚不可见时才有用。

有没有办法将项目滚动到视图中,然后在它进入视图时收到通知,以便模板不为空,以便ctrl.Focus()代码执行?

标签: wpf

解决方案


你可以处理这个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)
    {
        //...
    }
}

推荐阅读