一千萬個為什麽

搜索

如何創建可以替換自己的筆記本元素?

我想創建一個可以取代自己的筆記本元素。 這是一個例子來說明: Panel[Column[ {Style["This is a panel", Bold], Button["Press me!", SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookWrite[EvaluationNotebook[], "\"Now I'm just a piece of static text.\""]]}]]

這段代碼將創建一個小面板:

如果我們按下按鈕,面板將被一段靜態文本替換(即不是動態表達式,顯示為文本,而只是普通的非動態文本)。

好吧,在這個實現中實際上不是被替換的面板,而是包含面板的完整單元格,這就是我的問題:我需要只更換面板,所以即使panel只是一個更大表達式中的子表達式。 我們如何創建一個能夠用筆記本中的任意表達式替換自己的UI控件?

最佳答案

此解決方案依賴於在要替換的部件周圍放置帶有自定義標簽的 TagBox ,讀取單元格並替換標簽,然後將其寫回。就個人而言,我一直覺得需要閱讀整個單元格並再次寫出來似乎有點笨拙,但我不知道有更好的方法來做到這一點。 MakeBoxes[replacementMarker[a,tag],StandardForm]^:=TagBox[MakeBoxes[a],tag]

replaceMark[rule,nb:EvaluationNotebook[],which:All,cell:EvaluationCell]:=( SelectionMove[nb,which,cell]; NotebookWrite[EvaluationNotebook[],NotebookRead[EvaluationNotebook[]]/.rule])

Row[{"Not replaced", replacementMarker[ Panel[Column[{Style["This is a panel",Bold],Button["Press me!", replaceMark[TagBox[_,"replacementTag"] :> MakeBoxes["\" Now I'm just text. \""]] ]}]] ,"replacementTag"] ,"Not replaced"}]

重要的提示!該操作無法撤消,因此,如果用於允許動態重新格式化數據或類似操作,請註意錯誤最終可能會刪除舊內容。

轉載註明原文: 如何創建可以替換自己的筆記本元素?