若要檢視英文版的文章,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

其他 LightSwitch 控制項概念

大部分 LightSwitch 中控制項擴充功能的重要概念涵蓋在兩個逐步解說主題中,逐步解說:建立值控制項擴充功能逐步解說:建立詳細資料控制項擴充功能 不過,有幾個額外的概念可能套用在特定類型的控制項上。

在 LightSwitch 中,當它們出現在 DataGrid 或類似的容器控制項時,您可以設定控制項有不同的行為。 您可能會想要這個行為增加效能 (可編輯的控制項可以較昂貴以顯示),達成正確定位和焦點行為或兩者。 如果可設定焦點的控制項出現在 DataGrid內,若定位透過方格,使用者不僅可以將焦點設為 DataGrid 儲存格,也可以是基礎的控制項。 由於虛擬化,當 DataGrid 開始顯示快取的資料列時,這個行為會導致兩個定位停駐點在每個儲存格及其他問題。 因此,控制項的顯示模式絕對不可讓使用者給予焦點或修改控制項中的資料。 控制項的顯示模式檢視公開在 LightSwitch 在控制項 Factory 中的個別之資料範本。

如果控制項不可編輯,而且效能不是問題,則顯示模式範本是選擇性的。 根據您在控制項的自訂屬性,您可能會決定要用於顯示模式使用簡單 UI 的自訂屬性 (例如 TextBlock),或者完全控制的版本已停用的定位停駐點和視覺化點擊測試。

Silverlight 控制項的程式碼後置檔案包含 ControlFactory 類別,當它在 LightSwitch 螢幕上時提供控制項的資料範本或範本,。 類別包含 GetDisplayModeDataTemplate 函式,在其資料在 DataGrid 中未編輯時傳回控制項的唯讀版本。

ControlFactory 類別中 Constants 區段,請加入唯讀資料範本。 TextBlock 顯示文字而不是 TextBox 為示範版本,文字會顯示為紅色:

// control template for datagrid display mode
private const string DisplayModeControlTemplate =
    "<DataTemplate" +
    "  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
    "  <TextBlock Text='{Binding StringValue}' Margin='3' Foreground='Red' " +
    "             TextAlignment=\"{Binding Properties[Microsoft.LightSwitch:RootControl/TextAlignment]}\"" +
    "             VerticalAlignment=\"{Binding Properties[Microsoft.LightSwitch:RootControl/VerticalAlignment]}\"" +
    " />" +
    "</DataTemplate>";

ControlFactory 中的 GetDisplayModeDataTemplate 函式中,傳回新定義的唯讀範本:

public DataTemplate GetDisplayModeDataTemplate(IContentItem contentItem)
{
    // provide the display mode template
    if (null == this.displayModeDataTemplate)
    {
        this.displayModeDataTemplate = XamlReader.Load(MyControlFactory.DisplayModeControlTemplate) as DataTemplate;
    }
    return this.displayModeDataTemplate;
}

private DataTemplate displayModeDataTemplate;

在某些情況下,當控制項仍使用它的顯示模式範本時,使用者可能會開始在 DataGrid 中輸入。 在這種情況下, LightSwitch DataGrid 會處理切換至編輯模式的範本。 若要確定這個切換發生時字元不會遺失,則 DataGrid 會快取所有輸入的文字。

在控制項的 (不為 ControlFactory 類別) 程式碼後置類別中,實作 ISupportTextInput 介面,並加入下列實作方法。 這個方法可確保新項目取代文字,並將資料指標設到新文字的結尾,讓使用者可以繼續輸入。

private void ISupportTextInput_SetText(string text) 
{ 
if (this.TextBox != null) 
{ 
this.TextBox.Text = text; 
this.TextBox.SelectionStart = text.Length; 
} 
} 
void ISupportTextInput.SetText(string text) 
{ 
ISupportTextInput_SetText(text); 
}

如果您不想讓使用者變更控制項中的資料,您應該將 IsViewer 旗標加入至 .lsml 檔案之控制項的中繼資料,讓它成為檢視器控制項:

<Control Name="MyValueControl"
      SupportedContentItemKind="Value"
      IsViewer="True"
... >
  ...
  </Control>

加入這個旗標,會變更控制項是否在其他情況下發生。

一般模式是具有控制項的兩個版本。 一個版本啟用編輯資料 (「Editor 」),且一個版本只顯示資料 (「檢視器」)。 範例包括 AddressEditor/AddressViewerTextBox/Label

顯示唯讀資料的編輯器控制項與顯示唯讀資料的檢視器控制項不同。 大部分編輯器控制項在唯讀狀態中無法使用。 所有可編輯的控制項必須支援唯讀模式 (IContentItem.IsReadOnly),即使有配對的檢視器控制項。 這個唯讀模式通常但不一定會看起來與檢視器版本不同。

當螢幕首次載入時, LightSwitch 判斷使用的哪些控制項為所有在螢幕上的內容項目。 如果開發人員未指定特定控制項的用途,預設檢視對應集用於判斷節點的預設控制項。 這項評估會根據許多因素,包括父控制項、繫結資料的結構描述 (例如它是計算欄位、唯讀資料庫資料表或檢視) 和 Use Read-Only Controls 屬性的設定。 這些因素在設計階段決定,且您無法在執行階段變更它們。 根據這些考量,檢視器控制項或編輯器控制項會被選取( 假設兩個皆可供使用 )。

其他因素可能會在執行階段變更,例如 IsReadOnly 屬性、實體欄位的 X_IsReadOnly 屬性或授權設定,根據使用者程式碼和其他因素。內容項目的控制項不會在執行階段變更。 因此,如果編輯器控制項被選取,它會根據這些因素而出現在唯讀模式。 如果檢視器在螢幕載入時間被選取或開發人員在設計階段指定了檢視器,這個檢視器應該忽略 IContentItem.IsReadOnly 並永不啟用編輯。

當您建立一個對企業類型的控制項,您可以設定預設對應,以便當開發人員未指定控制項時,檢視器或編輯器會被選取。

編輯器和檢視器控制項可能經常共用屬性。 例如, ImageViewerImageEditor 控制項都會公開 Stretch 屬性。 如果每個控制項是定義 Stretch 屬性, LightSwitch 會視這兩個屬性為不同,且不會將其中一個屬性的值傳播給另一個。 若要解決這個問題,您應該建立一個從編輯器和檢視器控制項繼承的基本控制項,然後定義在基礎控制項的屬性:

<Control Name="MyBaseControl">
    <Control.Properties>
      <ControlProperty Name="MyCommonProperty"
        PropertyType=":String"
        CategoryName="Appearance"
        EditorVisibility="PropertySheet">
    </Control.Properties>
  </Control>

  <Control
      Name="MyViewerControl"
      BaseControl="MyBaseControl"
      SupportedContentItemKind="Value"
      IsViewer="True" 
      ...>
    <Control.Attributes>
      <DisplayName Value="My Viewer Control"/>
    </Control.Attributes>
    <Control.SupportedDataTypes>
      <SupportedDataType DataType="String"/>
    </Control.SupportedDataTypes>
...
  </Control>

  <Control
      Name="MyEditorControl"
      BaseControl="MyBaseControl"
      SupportedContentItemKind="Value" 
      ... >
    <Control.SupportedDataTypes>
      <SupportedDataType DataType="String"/>
    </Control.SupportedDataTypes>
...
  </Control>

請注意在這個檢視器的 IsViewer 屬性且只有屬性繼承自基底控制項。其他屬性,例如 SupportedDataTypesAttachedLabelSupport 不會繼承。 在此情況下,屬性 ID 為 MyModule:MyBaseControl/Properties[MyCommonProperty]

顯示: