如何连接到WPF树视图的BeforeNodeExpand和AfterNodeExpand?

如何连接到WPF树视图的BeforeNodeExpand和AfterNodeExpand?,wpf,treeview,Wpf,Treeview,意图:在节点的子节点填充期间显示忙/等待光标。 似乎隐藏在WPF中。我记得在Winforms树控件中有一些事件,您可以在其中订阅—以实现这一点 目前我有一个TreeView,它有许多ListView绑定到它的SelectedItem。所有控件都是数据绑定的,并使用数据模板显示项目。代码是功能性的。 但是当我扩展一个包含很多子节点的树节点时,UI会变得迟钝。。看起来点击没有注册。。作为一个不耐烦的用户,我去点击,点击节点 那我该怎么做呢?我想将光标设置为在展开前等待,在展开后重置 代码涂鸦: &l

意图:在节点的子节点填充期间显示忙/等待光标。

似乎隐藏在WPF中。我记得在Winforms树控件中有一些事件,您可以在其中订阅—以实现这一点

目前我有一个TreeView,它有许多ListView绑定到它的SelectedItem。所有控件都是数据绑定的,并使用数据模板显示项目。代码是功能性的。 但是当我扩展一个包含很多子节点的树节点时,UI会变得迟钝。。看起来点击没有注册。。作为一个不耐烦的用户,我去点击,点击节点

那我该怎么做呢?我想将光标设置为在展开前等待,在展开后重置

代码涂鸦:

<HierarchicalDataTemplate DataType="{x:Type local:LinqToSqlNodeClass}" ItemsSource="{Binding Path=Children}">
  // visual representation
</HierarchicalDataTemplate>
// more typed data templates 

<TreeView ItemsSource="{Binding Path=Nodes}" />

//视觉表现
//更多类型化数据模板

编辑-实现这一点的唯一方法是创建一个从TreeViewItem派生的类,覆盖OnExpand,并在调用基本Expand之前设置一个新的Expansing Routed事件。然后,您将使用这个新类作为容器,而不是默认的TreeViewItem

然后你可以做类似的事情

<TreeView cust:CustomTreeViewItem.Expanding="TreeView_Expanding">....</TreeView>
。。。。
先前的答案……

我唯一能看到您使用的是上的和事件

您必须更改模板以使用已定义事件的TreeViewItem


这是否适用于您的目的?

ItemContainerGenerator将在展开事件后开始生成,因此您可以使用它来设置光标,并在触发后将其设置回原位,以指示您的子项已填充

由于是一个路由事件,您只需在某个父级订阅:

myTreeView.AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(TreeViewItemExpanded));
在其他地方定义了TreeViewItemExpanded的地方,类似于:

private void TreeViewItemExpanded(object sender, RoutedEventArgs e)
{
    // we will only go through with this if our children haven't been populated
    TreeViewItem sourceItem = e.OriginalSource as TreeViewItem;
    if ((sourceItem != null)
        && (sourceItem.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated))
    {
        // create a handler that will check our children and reset the cursor when the ItemContainerGenerator has finished
        EventHandler itemsGenerated = null;
        DateTime before = DateTime.Now;
        itemsGenerated = delegate(object o, EventArgs args)
        {
            // if the children are done being generated...
            if ((o as ItemContainerGenerator).Status == GeneratorStatus.ContainersGenerated)
            {
                (o as ItemContainerGenerator).StatusChanged -= itemsGenerated;  // we're done, so remove the handler
                sourceItem.Dispatcher.BeginInvoke(DispatcherPriority.DataBind, (ThreadStart)delegate    // asynchronous reset of cursor
                {
                    myWindow.Cursor = Cursors.Arrow;    // reset cursor
                    Debug.WriteLine("Expanded in " + (DateTime.Now - before));
                });
            }
        };
        sourceItem.ItemContainerGenerator.StatusChanged += itemsGenerated;  // add the handler
        myWindow.Cursor = Cursors.Wait;     // wait cursor
    }
    e.Handled = true;
}

我猜展开的事件将在节点展开后触发。。我想在用户操作(双击或右箭头)和节点实际展开的时间间隔内显示忙碌的光标。这是需要花费很长时间的部分。Winforms方法将不起作用。正确的方法是使用MVVM—使用节点ViewModel修改IsBusy属性并控制IsExpanded属性。有人监听此属性更改通知&打开和关闭沙漏