wpf展开树节点_谈学习和知识树

6d8facdccbb7dbfb48cfbcdd55f4fadf.png

今天是2019年的最后一天,完成全年博客最后一天的日更,自己算了下从2017年2月开始已经差不多日更1050天的样子,继续保持中。

今天准备谈下学习和知识树方面的思考,最近自己在思维专栏上写的文章不算多,后续我准备还是花些时间把我思维类的一些文章做下系统性的整理。这篇关于学习和知识树的文章不能算系统,但是是我最近重要的一个思考,因此先要做个纪录,上图也仅仅是一个示例图。

问题:如何快速学习一个新领域或新知识点?

这是我经常会在知乎看到的一个问题,类似的提法还有很多,但是本质一样都是涉及到两个点,一个是知识点,一个是学习和掌握效率,对于原来我也写过一篇文章来谈如何快速的切入到一个新的领域,今天会做一些新的思考。

从知识树和知识结构的形成谈起

我们那数学的学习来举例。

从最简单的认识数字开始,到简单的加减乘除运算,再到方程,函数,再到微积分等。方程本身又从最简单的一元一次到一元多次和多元多次等,几何本身从最简单的线条和角,到平面几何,再到立体几何。也就是说从最简单的开始逐步学习,然后逐步向上抽象总结形成完整的知识树,知识树越上面的知识点越抽象或者说越难以快速理解。

包括我们现在看中学课本,很多教材后面的知识总结基本都是思维导图方式展开,而思维导图本身就是一个完整的知识树。

而对于数学,简单来说第一层展开是代数和几何,然后再分别展开具体的知识点,形成完整的数学学科,代数和几何本身又不孤立,相互之间有关联,那么代数和几何两块知识没有做到融汇贯通,那么整个数学无法学好。

再来看物理和化学两个学科,物理本身又分了力热光电多个知识点,而力学本身又是基本,因为后面的知识点学习全部要用到力学的知识,你力学没学好整个物理可能就学不好。

而物理追溯到最下面本身又是数学知识。你也可以看到往往是物理学的深入研究往往进一步促进了数学的发展,类似牛顿发明微积分等。那你数学基础没有打好,那么基本物理化学也很难学好。

也就是说数学,物理,化学几个学科之间本身又是关联的,也需要做到融会贯通才行。

而现在我们的中小学教育,基本就是分开各个学科教,从最简单的知识点开始教,然后由简入深,逐渐来完成整个学科的知识树,那么学科融合本身是体现在单个学科学习里面的,比如你们物理老师讲的内容,过程中自然会用到一些你们学过的数学知识点,但是一般不好专门提学科融合这个事。

对于新知识点的讲解

拿我们再来看,如果一个物理老师讲解一道比较复杂的物理题目,会出现情况

1. 不用老师讲解,自己完全就会做,更强的可能还会多种解法
2. 老师讲解后会做,但是自己想不到,简单来说就是下层知识点都明白,但是无法组合
3. 老师讲解后都难以理解,这个属于明显的下层知识点掌握缺少

如果你愿意学习,那么我认为对于第3点单个知识点的掌握都不应该由大问题,而问题出在知识点间的连接上面。这个连接是啥?这个连接可以理解为你在掌握了足够多的底层知识点后,对于分析和解决问题,抽象出来的适合你自己的方法论

这个抽象基本上老师不会教,老师教的往往仍然是大量做题,通过大量做题后再进行归纳整理,找到规律,抽象出自己的做题方法。但是这种方法会比较适用,即只要同类型或相似类似的题目你基本都能够搞定,这种简单的变通和映射能力你还是要有。但是完全一个新领域,新题型你往往仍然犯懵。

我们究竟需要什么样的学习能力?

把上面的东西理解清楚后可以看到,实际上在学校阶段的学习我们本身就在锻炼两个关键能力,而在进入大学后两个能力进一步转变为自己的自学能力。

1. 下层知识点的学习,然后逐步朝上归纳抽象,形成知识树的能力。
2. 跨学科,跨领域知识点间的关联和映射能力。

上面这两个能力相当重要,基本构成了我们后续新领域学习最关键的地方。在我们学习一个新领域的适合,往往是从下层知识点逐步朝上学习形成完整知识体系,而当别人给我们讲解或呈现一个新领域的适合,往往会自顶朝下的方式给你讲解。

那我们看当别人给你讲解一个新领域的知识,你如何才可能快速理解或掌握。为了方便说明,我们把该领域的知识树从顶朝下分为根-》干-》支-》叶几个关键节点,逐层展开。

知识点分解后快速回溯

首先别人会给你讲解根或干,那么这个时候会发现你无法理解,那么接着讲解支这一层,那么有些人就会发现这层的知识点我是清楚的,无须再进一步朝下展开,那么讲解的人就可以到此为止,并快速的朝上回溯完成整个领域关键知识或概念的讲解。

但是如果讲解的人要讲所有的东西都一直细分到最终的叶子节点,并把每一个叶子节点都讲解清楚,你才能够明白,那么你很难做到快速熟悉新领域,同时讲解人往往也没有这个耐心来给你讲。很多企业里面待新入职同事的人可能有感触,愿意带的人都是一点就通的?而啥叫一点即通,简单来说就是讲解的时候往往仅需要分解一层就能够快速回溯,细节的基础或知识点都不用你细讲就明白。

这也是为何我们招人一般还是要选择计算机或软件工程专业的,不论你学校学的如何,但是至少基础的知识点你学过,进来后不用我们给你讲基础知识和理论。

跨领域知识的连接和映射

其次,具备跨学科跨领域关联能力的人能够快速的掌握新领域知识。简单来说就是你跟他讲解一个新领域知识的时候,他能够快速的映射到自己已有领域的知识上面,并形成自己对新领域关键概念模型的理解。虽然新领域知识的很多底层原理一开始并没有搞请,但是并不妨碍他快速的理解这个新领域。因为只有你真正理解了该新领域的关键概念模型,你才能够进一步按部就班的展开深入的学习。

你如果具备这种映射能力,你又比别人进了一步,你会发现知识间不再是孤立的,而是一个大体系。道生一,一生二,二生三,三生万物。万变不离其宗。你学习的时候都是孤立的学科,但是学科间的映射关联很重要,如何来完成这个映射关联?而这个个人理解比较好的方法就是从初中开始开设自然科学课,这个课程重点就是完成跨学科知识学习,映射,关联,类别能力。

有时候我们看一个人,你发现他高一的数学成绩很差,实际上你会发现即使你拿初三的题目给他做可能也很难及格,到了高中阶段哪个老师还有闲心单独给你讲解初中的内容?任何你现在体现出来的成绩或问题,往往不算短期形成的,都是你历史积累很久欠账太多,要解决那就要从一开始慢慢还账。

这实际和我们看的武侠小说里面的练武很类似,武功分很多层,必须从最第一层练起,而哪些人练的快呢?一般都是基本功很扎实的人。然后就是第一层有很多招式,你要做到招式间融会贯通,才能够练就第一层进入到第二层,然后第二层又增加很多招式,又进一步练习和贯通。如果第一层都没有练习好就盲目的急功近利的练习第二层,往往就会走火入魔或者半途放弃。

所以你会发现学科弱的人的辅导实际是一个系统工程,你要不断的分解,从根到干到枝叶,找到这个学生究竟是分解到哪层后知识点掌握有问题,然后解决该层问题后再朝上回溯。这个过程不能急,急迫了也没有用,账本身就欠的太多太久,你也不要期望一天两天就能补回来。

如果你是找家教或一对一的辅导,这个本身不算老师好坏问题,而是要参考我们上面说的方法,并且有需要足够的学习时间投入。所以你也可以看到,对于知识点都掌握,但是没有贯通的人,往往一对一补习后进步会很大,但是对于本身下层知识点就缺失很多的人,绝对不可能短期进展很大。

要实现 WPF 节点形框的拖拽功能,可以采用以下步骤: 1. 在 XAML 中定义一个形控件,例如: ``` <TreeView x:Name="treeView"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="AllowDrop" Value="True"/> <EventSetter Event="PreviewMouseMove" Handler="TreeViewItem_PreviewMouseMove"/> <EventSetter Event="Drop" Handler="TreeViewItem_Drop"/> </Style> </TreeView.ItemContainerStyle> </TreeView> ``` 2. 在代码中为形控件的每个节点设置拖拽事件处理程序,例如: ``` private void TreeViewItem_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { TreeViewItem treeViewItem = FindAncestor<TreeViewItem>((DependencyObject)e.OriginalSource); if (treeViewItem != null) { DragDrop.DoDragDrop(treeViewItem, treeViewItem.DataContext, DragDropEffects.Move); e.Handled = true; } } } ``` 以上代码中,当节点上鼠标左键按下并移动时,会将节点的数据上下文作为拖拽数据,执行拖拽操作。 3. 在代码中为形控件的每个节点设置放置事件处理程序,例如: ``` private void TreeViewItem_Drop(object sender, DragEventArgs e) { TreeViewItem targetItem = FindAncestor<TreeViewItem>((DependencyObject)e.OriginalSource); if (targetItem != null) { object targetData = targetItem.DataContext; object sourceData = e.Data.GetData(typeof(object)); // 将 sourceData 移动到 targetData 下面 // ... e.Handled = true; } } ``` 以上代码中,当拖拽数据被放置到节点上时,会获取目标节点的数据上下文和拖拽数据,并执行相应的操作,例如将拖拽数据移动到目标节点下面。 4. 在代码中定义一个辅助方法,用于查找节点的祖先元素,例如: ``` private static T FindAncestor<T>(DependencyObject current) where T : DependencyObject { do { if (current is T ancestor) { return ancestor; } current = VisualTreeHelper.GetParent(current); } while (current != null); return null; } ``` 以上代码中,会从当前元素开始逐级向上查找,直到找到指定类型的祖先元素,或者查找到最上层的根元素为止。 通过以上步骤,就可以实现 WPF 节点形框的拖拽功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值