3

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

似乎隐藏在 WPF 中。我记得在 Winforms Tree Control 中有某种事件,您可以在其中订阅 - 来实现这一点。

目前我有一个 TreeView,它有许多与其 SelectedItem 相关的列表视图。所有控件都是数据绑定的,并使用 DataTemplates 来显示项目。代码是功能性的。但是当我展开一个有很多子节点的树节点时,UI 变得迟缓.. 看起来点击没有注册.. 而我作为不耐烦的用户去 clickety-click 节点。

那么我该怎么做呢?我想将光标设置为在 BeforeExpand 中等待并在 AfterExpand 中重置。

代码涂鸦:

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

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

2 回答 2

6

ItemContainerGenerator 将在 Expanded 事件之后开始生成,因此您可以使用它来设置 Cursor,并在ItemContainerGenerator.StatusChanged触发时将其设置回来以指示您的孩子已被填充。

由于TreeViewItem.Expanded是一个路由事件,您可以在某个父级别订阅:

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;
}
于 2009-01-07T23:32:46.983 回答
0

编辑 -完成此操作的唯一方法是创建一个派生自 TreeViewItem 的类并覆盖 OnExpand 并在调用基础扩展之前设置一个新的扩展路由事件。然后,您将使用这个新类作为您的容器,而不是默认的 TreeViewItem。

然后你可以做类似的事情

<TreeView cust:CustomTreeViewItem.Expanding="TreeView_Expanding">....</TreeView>

上一个答案....

我唯一能看到你使用的是TreeViewItem上的CollapsedExpanded事件

您必须更改模板以使用 TreeViewItem,并定义事件。

这对您的目的有用吗?

于 2009-01-06T15:19:52.703 回答