【问题标题】:Expand a Node in TreeView after a DraggedNode stands two seconds over it. C#在拖拽节点停留两秒后,在 TreeView 中展开一个节点。 C#
【发布时间】:2014-08-07 09:00:23
【问题描述】:

我的程序中有一个具有拖放功能的 TreeView,我正在尝试找到一种方法来在另一个节点 (DraggedNode) 停留超过 2 秒后展开节点。我认为更好的方法是使用计时器(但我并不真正了解如何使用它们)。这是我的代码。

private void treeView1_DragOver(object sender, DragEventArgs e)
    {
        TreeNode targetNode;
        TreeNode draggedNode;

        GetDraggedAndTargetNode(e, out targetNode, out draggedNode);

        e.Effect = DragDropEffects.Move;

        if (!targetNode.IsExpanded)
        {
            // set a Timer of 2 seconds 
            //System.Timers.Timer aTimer = new System.Timers.Timer();
            //aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            //aTimer.Interval = 2000;
            //aTimer.Enabled = true;
                targetNode.Expand();
        }
    }

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        // ???
    }

谢谢。

【问题讨论】:

标签: c# timer drag-and-drop treeview expand


【解决方案1】:

要访问 UI 元素,不要使用 System.Timers,而是使用普通的 Windows.Timer,就像工具箱中的那个一样!

将计时器声明移到事件之外,以便它可以继续存在。

在其 Tick 事件中停止计时器并执行其他操作。要访问应该扩展的节点,您可能还必须在某处存储对它的引用..

theTargetNode = null
Timer aTimer = new Timer();

private void treeView1_DragOver(object sender, DragEventArgs e)
{
    TreeNode targetNode;
    TreeNode draggedNode;

    GetDraggedAndTargetNode(e, out targetNode, out draggedNode);

    e.Effect = DragDropEffects.Move;

    if (!targetNode.IsExpanded)
    {
        theTargetNode = targetNode;
        // set a Timer of 2 seconds 
        aTimer.Tick += aTimer_Tick;
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
    }
}

private void aTimer_Tick(object source, EventArgs)
{
    aTimer.Stop();
    aTimer.Tick -= aTimer_Tick;
    if (theTargetNode != null) theTargetNode.Expand();
}

您还应该考虑在用户离开树等时停止计时器。

【讨论】:

  • @coloma1984:很好。您可以将初始化移动到form.Load 并简单地在Dragover 中启动它并保存aTimer.Tick -= aTimer_Tick;。你可能想接受答案 ;-)
  • 我使用了 StopWatch() 类。此外,您的逻辑似乎缺少一些东西。这个想法是:如果你站在 same 目标节点上的时间足够长,那么它应该会展开。如果您拖动另一个节点,则计时器应重置。
  • 我没有对那部分进行编码,但我在最后一句话中提到了它。因此,您可能希望在 Leave 中执行 aTimer.Stop(),在 MouseMove 事件中执行 aTimer.Stop(); aTimer.Start()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2012-03-10
相关资源
最近更新 更多