/// <summary>
        /// 題型項目選擇事件
        /// </summary>
        /// <param name="isChecked">是否選擇</param>
        /// <param name="expression">用以獲取控件基本信息對象</param>
        /// <exception cref="ArgumentNullException"><paramref name="expression"/>為NULL的情況</exception>
        public void TopicCheckedChanged(bool isChecked, Expression <Func <ControlInfo> > expression)
        {
            Guard.ArgumentNotNull(expression, "expression");

            ControlInfo info = expression.Compile()();

            if (isChecked)
            {
                // 題型預覽添加
                SetLayoutSettingPreviewList(info.Preview);
                // 取得HTML和JS的替換內容
                ConcurrentDictionary <SubstituteType, string> htmlMaps = GetHtmlReplaceContentMaps(info.Preview);
                // 按照題型將所有替換內容裝箱子
                _htmlMaps.Add(info.ControlId, htmlMaps);
            }
            else
            {
                // 題型預覽移除
                LayoutSettingPreviewList.Remove(info.Preview);
                // 題型移除
                _htmlMaps.Remove(info.ControlId);
                // 釋放部件資源
                MakeHtml.ReleaseExportsHtmlSupport(info.ControlId);
                PolicyHelper.Instance.ReleaseTopic(info.ControlId);
            }
        }
 /// <summary>
 /// 題型預覽列表設置
 /// </summary>
 /// <param name="name">題型名稱</param>
 public void SetLayoutSettingPreviewList(string name)
 {
     // 初期化
     if (LayoutSettingPreviewList == null)
     {
         LayoutSettingPreviewList = new List <string>()
         {
             // 標題區
             "Title",
             // 答題區
             "Ready"
         };
     }
     // 如果列表中不存在,則添加在答題區之前
     if (!LayoutSettingPreviewList.Any(d => d.Equals(name, StringComparison.CurrentCultureIgnoreCase)))
     {
         LayoutSettingPreviewList.Insert(LayoutSettingPreviewList.Count - 1, name);
     }
 }