葡京在线开户百度脑图核心——kityminder-editor 本地化改造

[索引页]
[源码下载]

如出一辙、思维导图是呀?

早在高中时代就放任同学提过想导图这种事物了,还记那是千篇一律按照物理辅导书。当时实在还不理解这种东西,可能是为及时物理太好,不需要利用思维导图来援助记忆那些知识点
(⊙o⊙)。那时候的印象就是是各个一个知识点会画画成一个沾延伸出的图形,这为就是思想导图的要紧造型了。

稳扎稳打Silverlight(64) – 5.0绑定的 Style 中的 Setter 支持绑定,
绑定父级链上之要素, 隐式指定数量模板, UI 上数更新的触及方式

次、百度脑图

百度脑图凡一律款款在线的盘算导图软件,实在是强烈推荐。唯一的毛病就是无地面的客户端软件。当然我出下了想导图的PC端软件:Xmind,imindMap、Edraw。确实,该有的成效还有。但是!但是!但是!都召开的非常臭!而且每软件的装包大小,小至100M,大到500+M,对这个,我是为难容忍的。回过头来看百度脑图,输入网址,一个个帅的思索导图就应运而生了,论美观度,我吃百度脑图100分。百度脑图相比于其他软件来说,可以挑选的预设思维导图种类会少生多,毕竟百度脑图使用的是js和html绘制,可操作性还是会丢好多之。种类少并无局限为其的实用性。在这大概看颜的时日,我照百度过脑图一律批。

作者:webabcd

其三、百度脑图核心——kityminder

头脑图用起还很多糟的地方,所以便不时吃脑图写报告意见。偶然一潮发现,百度脑图其实是因
kityminder 进行二次开发的一个活而已。kityminder
本身是一个开源软件,也就是说,任何人都得以应用源代码进行二次开发并使用。本人为是一个矛盾体,在偏向于轻快的制品的以,又未思量吃网络局限。住的那地方的纱简直让人痛心啊,隔三差五就吃丁闹别扭,恨不得拔网线泄恨,当然说说归说说。所以
kityminder 能够彻底解决这个题材,那么尽管心动不苟行动吧。

介绍
Silverlight 5.0 绑定

四、Kityminder 大变身

  1. 下载kityminder 到本地
    找到kityminder 的github
    官方地址,复制kityminder
    的git 仓库地址,在当地利用git clone 仓库地址,代码就起在该地了。
  2. 加上导入文本按钮
    dist/index.html文件里顶部是一个h1标签,添加以下代码

<button class="diy">
    导入
    <input type="file" id="fileInput">
</button>

又还索要在head标签中上加diy仿佛的体裁

.diy {
    height: 30px;
    line-height: 30px;
    margin-top: 5px;
    float: right;
    color: #333;
    overflow: hidden;
    position: relative;
}
.diy input {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: inline-block;
    opacity: 0;
}

从此以后就需要利用js 来支配文件导入的操作。

// 导入
window.onload = function() {
    var fileInput = document.getElementById('fileInput');

    fileInput.addEventListener('change', function(e) {
        var file = fileInput.files[0],
                // textType = /(md|km)/,
                fileType = file.name.substr(file.name.lastIndexOf('.')+1);
        switch(fileType){
            case 'md':
                fileType = 'markdown';
                break;
            case 'km':
            case 'json':
                fileType = 'json';
                break;
            default:
                console.log("File not supported!");
                alert('只支持.km、.md、.json文件');
                return;
        }
        var reader = new FileReader();
        reader.onload = function(e) {
            var content = reader.result;
            editor.minder.importData(fileType, content).then(function(data){
                $(fileInput).val('');
            });
        }
        reader.readAsText(file);
    });
}

kityminder
原生支持json格式和markdown格式(.km文件是百度脑图网址支持导出的格式,但那个精神实际上就算是Json格式),经过协调测试,json格式所蕴藏的信是不过丰富的,所以一般要建议下.json文件或者.km文件。
这边的公文读取使用的凡 js 的 FileReader 对象,不了解之好自动百度。

  1. 上加导出文件按钮
    及导入一样,导出也足以分成两栽格式,代码如下:

// 导出
$(document).on('click', '.export', function(event) {
    event.preventDefault();
    var type = $(this).data('type'),
            exportType;
    switch(type){
        case 'km':
            exportType = 'json';
            break;
        case 'md':
            exportType = 'markdown';
            break;
        default:
            exportType = type;
            break;
    }
    editor.minder.exportData(exportType).then(function(content){
        switch(exportType){
            case 'json':
                console.log($.parseJSON(content));
                break;
            default:
                console.log(content);
                break;
        }
        var aLink = document.createElement('a'),
                evt = document.createEvent("HTMLEvents"),
                blob = new Blob([content]);

        evt.initEvent("click", false, false);
        aLink.download = $('#node_text1').text()+'.'+type;
        aLink.href = URL.createObjectURL(blob);
        aLink.dispatchEvent(evt);
    });
});

盖没后台,文件的导出使用的是浏览器的Blob靶,然后模拟a链接的点击进行下载。

  1. 主导代码提取出
    kityminder所有的老三正组件都当bower_components文本夹着,所以必须管此文件夹复制过来,路径和index.html屡遭的静态资源目录保持一致。

诸如此类,一个通通本地化的脑图就好了。
Tips:介于太多人口要求要成改好之项目,给起好的
github仓库:https://github.com/LancelotLewis/local-kitymind
(2017-05-10)

巴个人博客对应博文地址:
http://lancelot\_lewis.coding.me/2016/06/21/javascript/kityminder-local/

  • StyleSetter – Style 中之 Setter 支持绑定
  • AncestorRelativeSource – 绑定父级链上之素
  • ImplicitDataTemplate – 隐式指定数量模板
  • FrameworkElement.DataContextChanged
  • UpdateSourceTrigger – UI 上数据更新的触发方式

在线DEMO
http://www.cnblogs.com/webabcd/archive/2012/03/05/2379862.html

示例
1、StyleSetter(Style 中之 Setter 支持绑定)
Binding/StyleSetter.xaml

<navigation:Page x:Class="Silverlight50.Binding.StyleSetter" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="StyleSetter Page"

           xmlns:clr="clr-namespace:System;assembly=mscorlib">

    <Grid x:Name="LayoutRoot">

        <Grid.Resources>
            <!--设置一些资源-->
            <clr:Int32 x:Key="TextFontSize">24</clr:Int32>
            <SolidColorBrush x:Key="TextForeground" Color="#00FF00" />

            <!--为 Style 的 Setter 的 Value 做数据绑定-->
            <Style x:Key="MyStyle" TargetType="TextBox">
                <Setter Property="FontSize" Value="{Binding Source={StaticResource TextFontSize}}"/>
                <Setter Property="Foreground" Value="{Binding Source={StaticResource TextForeground}}"/>
            </Style>
        </Grid.Resources>

        <!--应用样式-->
        <TextBox Text="我是TextBox" Margin="5" Style="{StaticResource MyStyle}" />

    </Grid>
</navigation:Page>

2、AncestorRelativeSource(绑定父级链上之因素)
Binding/AncestorRelativeSource.xaml

<navigation:Page x:Class="Silverlight50.Binding.AncestorRelativeSource" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="AncestorRelativeSource Page">
    <Grid x:Name="LayoutRoot">

        <!--
            关于 RelativeSource 参看 http://www.cnblogs.com/webabcd/archive/2009/09/03/1559240.html
        -->

        <!--
            Silverlight 5 的 RelativeSource(除了 Self 和 TemplatedParent 外)新增了 FindAncestor

            FindAncestor - 指定相对数据源为父级链上的元素(如果指定了 AncestorType 或 AncestorLevel 则为 FindAncestor 模式,即可以不用显示指定 FindAncestor)
            AncestorType - 数据源的类型
            AncestorLevel - 数据源相对于自己的相隔层级数,AncestorLevel = 1 代表最近的父级元素
        -->

        <ListBox Tag="我是 Tag" Name="listBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox, AncestorLevel=1}}"/>
                        <TextBlock Text="{Binding}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>
</navigation:Page>

Binding/AncestorRelativeSource.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

namespace Silverlight50.Binding
{
    public partial class AncestorRelativeSource : Page
    {
        public AncestorRelativeSource()
        {
            InitializeComponent();

            listBox.ItemsSource = new List<string>(){"1", "2", "3"};
        }
    }
}

3、ImplicitDataTemplate(隐式指定数量模板)
Binding/ImplicitDataTemplate.xaml

<navigation:Page x:Class="Silverlight50.Binding.ImplicitDataTemplate" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="ImplicitDataTemplate Page"

           xmlns:local="clr-namespace:Silverlight50.Binding">

    <StackPanel x:Name="LayoutRoot" Orientation="Vertical">

        <StackPanel.Resources>
            <!--
                DataType - 如果数据项为此类型则使用此模板(隐式)
            -->
            <DataTemplate DataType="local:Person">
                <TextBlock Foreground="Red" Text="{Binding Name}" />
            </DataTemplate>
            <DataTemplate DataType="local:Employee">
                <TextBlock Foreground="Blue" Text="{Binding Name}" />
            </DataTemplate>
        </StackPanel.Resources>

        <!--数据源的数据项为 Person 类型,所以会使用第一个数据模板-->
        <ListBox x:Name="listBoxPersons" />

        <!--数据源的数据项为 Employee 类型,所以会使用第二个数据模板-->
        <ListBox x:Name="listBoxEmployees" />

    </StackPanel>
</navigation:Page>

Binding/ImplicitDataTemplate.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

using System.Collections.ObjectModel;

namespace Silverlight50.Binding
{
    public partial class ImplicitDataTemplate : Page
    {
        public ImplicitDataTemplate()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(ImplicitDataTemplate_Loaded);
        }

        void ImplicitDataTemplate_Loaded(object sender, RoutedEventArgs e)
        {
            // 为 listBoxPersons 绑定的数据源的数据项为 Person 类型
            listBoxPersons.ItemsSource = new ObservableCollection<Person>
            {
                new Person { Name = "webabcd" },
                new Person { Name = "webabcd2" }
            };

            // 为 listBoxEmployees 绑定的数据源的数据项为 Employee 类型
            listBoxEmployees.ItemsSource = new ObservableCollection<Employee>
            {
                new Employee { Name = "webabcd3" },
                new Employee { Name = "webabcd4" },
                new Employee { Name = "webabcd5" }
            };
        }
    }

    public class Person
    {
        public string Name { get; set; }
    }

    public class Employee : Person
    {
        public string Position { get; set; }
    }
}

4、FrameworkElement.DataContextChanged
Binding/DataContextChanged.xaml

<navigation:Page x:Class="Silverlight50.Binding.DataContextChanged" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="DataContextChanged Page">
    <StackPanel x:Name="LayoutRoot">

        <Button x:Name="btnChange" Content="改变数据上下文" Click="btnChange_Click" />
        <ListBox x:Name="listBox" ItemsSource="{Binding}" DataContextChanged="listBox_DataContextChanged" />

    </StackPanel>
</navigation:Page>

Binding/DataContextChanged.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

namespace Silverlight50.Binding
{
    public partial class DataContextChanged : Page
    {
        public DataContextChanged()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(DataContextChanged_Loaded);
        }

        void DataContextChanged_Loaded(object sender, RoutedEventArgs e)
        {
            // 绑定初始数据上下文
            listBox.DataContext = new List<string> { "a", "b", "c" };
        }

        private void btnChange_Click(object sender, RoutedEventArgs e)
        {
            // 修改数据上下文
            listBox.DataContext = new List<string> { "x", "y", "z" };
        }

        private void listBox_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            /*
             * FrameworkElement.DataContextChanged - 数据上下文发生改变后所触发的事件
             */

            // 数据上下文发生改变后
            MessageBox.Show("数据源发生改变");
        }
    }
}

5、UpdateSourceTrigger(UI 上数更新的接触方式)
Binding/UpdateSourceTrigger.xaml

<navigation:Page x:Class="Silverlight50.Binding.UpdateSourceTrigger" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="UpdateSourceTrigger Page">
    <StackPanel x:Name="LayoutRoot">

        <!--
            UpdateSourceTrigger - UI 上数据更新的触发方式
                Default - 失去焦点后触发
                PropertyChanged - 属性值发生改变后触发
                Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发
        -->
        <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lbl, UpdateSourceTrigger=Default}" />
        <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lbl, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Name="txtExplicit" Text="{Binding Text, Mode=TwoWay, ElementName=lbl, UpdateSourceTrigger=Explicit}" />
        <Button Name="btnBinding" Content="显示触发更新" Click="btnBinding_Click" />

        <TextBlock Name="lbl" />

    </StackPanel>
</navigation:Page>

Binding/UpdateSourceTrigger.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

using System.Windows.Data;

namespace Silverlight50.Binding
{
    public partial class UpdateSourceTrigger : Page
    {
        public UpdateSourceTrigger()
        {
            InitializeComponent();
        }

        private void btnBinding_Click(object sender, RoutedEventArgs e)
        {
            // 显示触发 txtExplicit 的数据更新
            BindingExpression be = txtExplicit.GetBindingExpression(TextBox.TextProperty);
            be.UpdateSource();
        }
    }
}

OK
[源码下载]