表單:一般指導方針和最佳作法
發行︰ 2016年7月
適用於: System Center 2012 SP1 - Service Manager、System Center 2012 R2 Service Manager、System Center 2012 - Service Manager
您可以透過新增或修改表單的方式來擴充 System Center 2012 – Service Manager 的功能。 本主題說明直接透用各種工具及指令碼表單定義,建立及使用 Service Manager 表單的某些最佳作法建議。
本主題主要適用對象是合作夥伴和客戶,且這些合作夥伴和客戶具有使用 Windows Presentation Foundation (WPF) 以及 Microsoft Visual Studio Team System 或 Microsoft Expression Blend 建置其專屬自訂表單的經驗。
撰寫新表單的一般指導方針如下:
使用標準控制項。
遵循一般表單設計指導方針。
避免程式碼後置。
包含例外狀況處理。
考量表單自訂與升級。
命名所有可自訂控制項。
將表單繫結至資料來源。
使用 Service Manager 表單基礎結構驗證規則、值轉換器和錯誤範本。
使用表單基礎結構命令和事件。
如需這些指導方針的詳細資訊,請參閱下列各節。
使用標準控制項
表單上使用的控制項可以是:
標準控制項。 這包括 .NET 程式庫控制項,例如下拉式方塊和清單方塊。
自訂控制項。 這包括表單作者或協力廠商建立的其他控制項。
提示 |
---|
|
遵循一般表單設計指導方針
在設計表單時,請使用公開的設計指導方針,確保表單不僅方便使用,而且符合一般的使用者互動典範。
如需一般 Windows 設計的詳細資訊,請參閱 Windows User Experience Interaction Guidelines (Windows 使用者經驗指導方針)。
其他情況:
在多個實驗室之間分割資訊,讓表單變得更簡單也更方便閱讀。 請將最常用的資訊包含在第一個索引標籤中,並將較不重要的資訊放在後面的索引標籤上。
使用版面配置面板來編排表單上的控制項。 這可確保表單在調整大小與當地語系化時會有正確的行為表現。
避免設定個別控制項視覺內容,並改用樣式。 如此,您便可透過修改樣式來變更一系列表單中所有控制項的外觀,並讓相關的表單具有更一致的外觀。
避免程式碼後置
「程式碼後置 」一詞係用來描述對 XAML 頁面進行標記編譯時與標記定義之物件聯結的程式碼。 請盡可能避免在表單中使用程式碼後置。 最理想的作法是將表單的程式碼內嵌在控制項本身,因為後續變更該程式碼的工作會變得較容易。 請改用 Service Manager 表單基礎結構支援的宣告功能,在表單中定義值轉換及驗證規則。
作為一般準則,您應該限制成只在下列情況使用程式碼後置:無法使用 XAML 的宣告功能,以 WPF 和表單基礎結構程式庫定義的類別,提供需要的功能。 即使如此,您仍應考慮將程式碼後置中實作的功能移入協助程式程式庫,然後從 XAML 參照該程式庫。
包含例外狀況處理
請確認表單中的程式碼包含例外狀況處理,讓表單可於設計階段及執行階段分別載入 製作工具 以及 Service Manager 主控台 中。
考量表單自訂與升級
在設計新表單時,您應考量未來對該表單進行的自訂及升級。 為確保您可以自訂表單,也可升級表單同時保留自訂內容,請遵守本節前面提供的指導方針和秘訣,以及下列指導方針:
在設計表單時及早考量未來的自訂與升級。 表單在未來的版本中可能會進行改良,因此請務必考量使用者應如何升級至新版表單,同時保留其對原始表單所進行的自訂設定。 例如,在使用者已投入大量資源自訂原始表單之後,您可能會提供更新的表單。 使用者希望在版本升級後,仍可保留他們的自訂內容。
為表單上的每個控制項提供唯一的名稱,讓您可將自訂套用到控制項。 表單自訂會儲存成以特定控制項或一組控制項作為目標的一組動作。 目標控制項以名稱參照,因此請務必在所有版本的表單之間保留控制項名稱。 如果控制項沒有名稱,表單自訂編輯器會產生名稱,但是產生的名稱不會在不同版本的表單間保留。
確認控制項名稱在不同版本的表單之間仍維持不變。 這可確保先前版本中特定控制項的自訂可以套用到新版表單中的相同控制項。
如果可能,在升級表單時,請避免將控制項移到相同索引標籤的不同位置。 常見的使用者自訂是在表單上將控制項移到不同的位置。 如果您在新版表單上變更控制項的位置,新的控制項位置可能會與使用者已變更位置的控制項重疊。
如果可能,請在設計現有表單的更新時,避免在索引標籤之間移動控制項。 控制項是以名稱與其所在位置索引標籤兩者來識別。 在新版表單中將控制項從某個索引標籤移到另一個,可能會破壞使用者對該控制項進行的自訂,因為這些自訂將無法識別目標控制項。
當表單的更新包含新控制項時,請考慮將新控制項加到新索引標籤上。 這是避免干擾現有索引標籤和控制項之任何使用者自訂最安全的方法。
請注意控制項的繫結方式。 唯讀控制項只能使用單向繫結。
命名所有可自訂控制項
請確認控制項名稱係描述控制項所繫結的資料,或是描述控制項的功能。
將表單繫結至資料來源
表單的主要用途是要具體呈現 Service Manager 資料庫中的單一物件。 這個物件稱為 target instance,且一律由表單的 DataContext 內容 (繼承自 FrameworkElement 類別) 指定。
重要 |
---|
|
在 Service Manager 資料模型中,目標執行個體是以 BindableDataItem 物件來代表。 這個類別可彙總軟體開發套件 (SDK) 物件,並透過採用內容名稱作為參數的索引子公開其內容。
BindableDataItem 類別也會實作 ICustomTypeDescriptor,使您能夠使用 BindableDataItem 類別作為 WPF 繫結的資料來源。 下列範例顯示將目標執行個體內容繫結至 Text 控制項的 TextBox 內容:
<TextBox Name="textBoxDescription" Text="{Binding Path=Summary}"/>
您不需要指定繫結的 Source ,因為目標執行個體已設定為表單的 DataContext ,作為表單上所有控制項的預設 Source 。
表單上的控制項可以繫結到目標執行個體以外的資料來源,而表單基礎結構程式庫則包含幾個以隱含方式執行繫結的控制項。 例如,執行個體選擇器控制項會繫結到資料來源,由資料來源提供可供選擇的執行個體集合。 您也可以使用 ObjectDataProvider 和 XmlDataProvider 類別,以宣告方式定義其他資料來源。
表單基礎結構會將目標執行個體視為表單上的唯一讀/寫資料來源。 因此, Submit 命令的實作只會儲存對目標執行個體所做的變更。 表單的其他資料來源都被視為唯讀。
使用 Service Manager 表單基礎結構驗證規則、值轉換器和錯誤範本
建議您在表單中使用表單基礎結構驗證規則來指定無效的資料輸入。 WPF 繫結基礎結構可支援驗證以單向或雙向繫結繫結至資料來源的控制項內容。 繫結物件具有 ValidationRules 集合,而此集合可以包含任何數目的 ValidationRule 物件。 每當資料從控制項推播到資料來源時,系統都會呼叫 ValidationRule 物件來驗證值。
表單基礎結構程式庫包含幾項驗證規則,可處理最常見的狀況。 表單基礎結構利用這些驗證規則來判斷表單內容是否可提交以供儲存。 例如,如果表單上有個控制項發生驗證錯誤,您可以停用表單的 [提交] 按鈕。
建議您使用表單基礎結構程式庫所提供的自訂錯誤範本。 如果控制項發生驗證錯誤,依預設其周圍會出現紅色框線。 WPF 可讓您透過 Validation.ErrorTemplate 內容 (可在任何控制項上設定) 定義自訂錯誤指標。 Service Manager 表單基礎結構程式庫包含的自訂錯誤範本顯示的是錯誤圖示,不是 WPF 紅色框線。 此外,當滑鼠指向錯誤圖示時,將會出現內含錯誤訊息的工具提示。 錯誤訊息應該會指出控制項中資料驗證失敗的原因。
下列範例顯示如何在 XAML 中參照此錯誤範本:
<TextBox Text="{Binding SomeProperty}"
scwpf:Validation.ValueRequired="True"
Validation.ErrorTemplate="{DynamicResource {ComponentResourceKey {x:Type scwpf:Validation}, InvalidDataErrorTemplate}}"/>
如果內建驗證規則未提供必要的驗證邏輯,建議您建立自訂驗證規則來代表該邏輯。 如此便可讓標準和自訂驗證邏輯共存在一般驗證處理機制內。
如果驗證規則機制不足以應付特定案例,您應該改為處理 FormEvents.PreviewSubmitEvent 並從該處執行驗證。
下列程式碼範例提供可用來執行自訂驗證的模式範例:
void MyForm_Loaded(object sender, RoutedEventArgs e)
{
// hook to handle form events
this.AddHandler(
FormEvents.PreviewSubmitEvent,
new EventHandler<PreviewFormCommandEventArgs>(this.OnPreviewSubmit));
}
private void OnPreviewSubmit(object sender, PreviewFormCommandEventArgs e)
{
string errorMessage;
bool result = this.DoVerify(out errorMessage);
if (!result)
{
// cancel Submit operation
e.Cancel = true;
// display error message
MessageBox.Show(errorMessage);
}
}
internal bool DoVerify(out string errorMessage)
{
// Do custom verification and return true to indicate that
// validation check has passed; otherwise return false and
// populate errorMessage argument
}
使用表單基礎結構命令和事件
表單基礎結構提供幾個可在表單上執行的命令。 這些命令包括:
FormsCommand.Submit,用於儲存表單的目標執行個體。
FormsCommand.SubmitAndClose,用於儲存表單的目標執行個體並關閉表單。
FormsCommand.Refresh,用於重複查詢表單的目標執行個體。
FormCommands.Cancel,用於捨棄所有變更並關閉表單。
這些命令前後都以事件包圍,在命令執行之前和之後都會產生事件。
執行命令之前會產生下列事件:
FormEvents.PreviewSubmit 事件在 FormCommand.Submit 命令之前產生,而 FormEvents.Submitted 事件則在 FormCommand.Submit 命令之後產生。
FormEvents.PreviewRefresh 事件在 FormCommands.Refresh 命令之前產生,而 FormCommand.Refreshed 命令則在 FormCommand.Submit 命令之後產生。
FormEvents.PreviewCancel 事件在 FormCommands.Cancel 命令之前產生,而 FormCommand.Canceled 事件則在 FormCommand.Cancel 命令之後產生。
預覽事件可傳遞 PreviewFormCommandEventArgs 物件。 這個物件包含可變動的 Cancel 內容,當此內容設定為 true時,即可讓對應的命令無法執行。
命令後續事件可傳遞 FormCommandExecutedEventArgs 物件。 此物件包含 Result 內容,指出命令是否執行成功、已取消或造成錯誤。 若發生錯誤, FormCommandExecutedEventArgs 物件的 Error 內容便會參照例外狀況,提供錯誤相關資訊。
您可以透過程式和宣告方式啟用、停用及執行表單命令。
若要以程式啟用表單命令,請在表單和相關命令之間建立 CommandBinding 。
下列範例在表單和 Refresh 命令之間建立了命令繫結,並針對此命令定義了兩個處理常式。 第一個處理常式傳回 Refresh 命令是否可執行,而第二個處理常式實際包含了 Refresh 命令的實作:
public class MyForm : UserControl
{
public MyForm()
{
// do standard initialization
// establish CommandBinding for Refresh command
this.CommandBindings.Add(
new CommandBinding(FormCommands.Refresh, this.ExecuteRefresh, this.CanExecuteRefresh));
}
private void CanExecuteRefresh(
object sender,
CanExecuteRoutedEventArgs e)
{
// put your logic that determines whether Refresh
// can be executed here
bool canExecute = true;
BindableDataItem dataItem = this.DataContext as BindableDataItem;
if (dataItem)
{
canExecute = dataItem["Status"] != "New";
}
e.CanExecute = canExecute;
}
private void ExecuteRefresh(
object sender,
ExecutedRoutedEventArgs e)
{
// here is placeholder for the code that has do be
// executed upon running Refresh command
}
}
您也可以宣告方式定義表單的處理常式。 您可以採用使用 RoutedCommandTrigger 的 Rule物件來執行此作業。 下列程式碼範例顯示如何以宣告方式定義處理常式:
<scwpf:BusinessLogic.Rules>
<scwpf:RuleCollection>
<scwpf:Rule>
<scwpf:Rule.Triggers>
<scwpf:RoutedCommandTrigger
RoutedCommand="{x:Static scwpf:FormCommands.Refresh}"/>
</scwpf:Rule.Triggers>
<scwpf:Rule.Conditions>
<scwpf:PropertyMatchCondition
Binding="{Binding Status}"
Value="New"
Operation="NotEquals" />
</scwpf:Rule.Conditions>
<!-- Use RuleAction objects to define the logic that executed
upon running Refresh command; this can be left empty -->
</scwpf:Rule>
</scwpf:RuleCollection>
</scwpf:BusinessLogic.Rules>
另請參閱
Windows Presentation Foundation (WPF) 網站 (WindowsClient.NET)
表單:自訂和撰寫