当DraggedNode在TreeView中停留两秒后展开节点.c#

本文关键字:两秒 节点 DraggedNode TreeView 停留 | 更新日期: 2023-09-27 18:17:06

我有一个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)
    {
        // ???
    }

谢谢。

当DraggedNode在TreeView中停留两秒后展开节点.c#

访问UI元素时不要使用System。计时器,但普通的窗口。定时器就像工具箱里的那个!

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

在它的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();
}

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