存储并跟踪面板状态

在前端的各个会话中,我们可以配置面板使其可以记住以前的状态. 这对于包含多个可扩展章节、标签视图、复选框和其它控件对象. 例如,对于一个花了很大精力关闭10个启动开关视窗中的9个的用户来说,他/她不会希望在每次打开面板时再重复以上操作.
这里有一些方式 Wolfram 系统可以存储并且跟踪控件对象的状态. 第一种方法涉及动态变量,而第二种方法涉及 TaggingRules. 由 DynamicModule 跟踪的动态变量存储在笔记本表达式之中,因此要求面板笔记本是可以存储的,这样我们就可以保存我们所进行的改动. 而另一方面,对于位于 PalettePath 上的面板笔记本,TaggingRules 由前端的一个不同的文件缓存. 这说明如果要对状态进行存储,面板笔记本本身不需要是可存的. 此外,如果在笔记本层次上,TaggingRules 以选项形式存储,则这些值可以通过类似 Options[Get["filepath"],TaggingRules] 的表达式从其它笔记本访问.
动态变量
正如 "高级动态功能" 中所述,DynamicModule 在每次计算的输出中保持动态变量的值. 然而, DynamicModule 对于应该在多个会话中持续存在的面板来说,用它来存储值是不恰当的. 为了使 DynamicModule 的值能够持续存在,必须保存包含 DynamicModule 的文档,并且面板可能在一些绝对禁止对它们进行保存的地址下保存.
对于每次打开面板都需要重设的值而言,DynamicModule 是完全可以用来保存它的. 下面是包含两个控件对象和两个动态变量的例子.

1.gif

在下面的面板中,通过点击加号或者减号按钮,这两个复选框可以同时被选中或者被取消选中. 这些按钮对控件对象的状态设置新的动态变量值.

2.gif

可以使用相同的动态变量控制两个控件对象,这样可以同时选中它们和取消对它们的选中.

3.gif

TaggingRules
TaggingRules 是单元、笔记本和前端的一个选项,它提供了存储选中的额外信息的一种方式. 它对于在笔记本搜索、计算或者其它操作中,使用一个单元存储元数据或者对一个单元附加一些值用于调用是很有用的. TaggingRules 可以是字符串列表或者规则列表.
下面是在笔记本层次上使用 TaggingRules 的两个基本例子;第一个是一个规则,第二个是一个规则列表.
TaggingRules 也可用于存储在 PalettePath 上保存的面板笔记本的控件对象的状态值. 前端自动在全局选项 PalettesMenuSettings 中缓存标记规则的当前值.
这说明我们确保显式的标记规则可以在不同前端会话中记住它们的控件对象的状态. 例如,如果用户打开一个由标记规则跟踪的启动开关,然后再关闭前端,当用户在以后的前端会话中再次打开这个面板时,启动开关将还是开着的.
面板笔记本的标记规则以一个规则或者规则列表的方式实现,并且控件对象的状态使用动态 CurrentValue 语句设置这些标记规则的值,比如下面例子中的标记规则 "TagName".
"TagName" 返回 Inherited,除非已经提供了初始值. 在下面的例子中,Checkbox 的状态由 "TagName2" 跟踪,该标记的初始值为 True. 选中或者取消对 Checkbox 的选中,将使 TaggingRules 的值变为 True 或者 False.
可以在相同时间内跟踪多个控件对象的状态. 在下面的例子中,两个启动开关的状态分别由 "MyOpenerValue1""MyOpenerValue2" 跟踪,并且它们带有初始值.

4.gif

一旦我们已经把标记值付给控件对象的状态,可以创建按钮或者其它控件来修改这些值的组. 这里,两个启动开关都可以通过点击加号或者减号按钮展开或关闭. 这些按钮对控件对象状态设置新的选项值,这些控件对象状态是动态更新的.

5.gif

两个控件对象可以使用相同的 TaggingRules 值做标记,这样这两个对象可以同时打开和关闭.

6.gif

可以对标记规则进行组织整理,使得在面板上展开一个启动开关自动关闭另一个启动开关. 在这个例子中,Dynamic 的第二个变量用来控制相反的启动开关的状态.

7.gif

如果您有与想查看的笔记本相对应的 NotebookObject,您也可以从笔记本外查看 TaggingRules. CreatePalette 总返回一个可以用来实现这个目的的 NotebookObject.
值也可以从笔记本外设置,只需把适当的 CurrentValue 表达式当作一个变量对其赋予一个值,就可以实现. 这样做可以用来调试,或者在多个面板或笔记本交互作用时也是很有用的.