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