其他 LightSwitch 控制項概念
大部分的重要的概念,關於控制項的副檔名Visual Studio LightSwitch兩個逐步解說主題中,將會涵蓋逐步解說:建立值控制項擴充功能和逐步解說:建立詳細資料控制項擴充功能。 有,但是其他可能套用用於某些類型的控制項的幾個概念。
DisplayMode 支援加入至控制項
在LightSwitch,您可以設定控制項的行為表現不同內容實際出現在DataGrid或類似的容器控制項。 您可以這種行為,以增加效能(可編輯的控制項可以是較為昂貴,無法顯示),以達到正確的定位停駐和焦點行為,或兩者。 如果可設定焦點的控制項出現在DataGrid,使用者可以,當 tab 鍵方格中,將焦點設定避免只給DataGrid也至基礎控制項的儲存格。 這種情形會造成每個儲存格和其他問題的兩個定位停駐點時DataGrid因為虛擬顯示 UI 的快取資料列就會開始。 因此,顯示模式的控制項應該永遠不會讓使用者將焦點置於其或修改控制項中的資料。 控制項的顯示模式檢視公開給LightSwitch為不同的資料範本控制項工廠。
如果控制項不能編輯,而且效能並不是問題,顯示模式範本是選擇性的。 取決於您在控制項設定的自訂屬性,您也許打算使用顯示模式的一個簡單的 UI (例如TextBlock),或完全控制,以定位停駐點和叫用的視覺版本測試停用。
程式碼-後置檔案的設計階段支援的控制項包含ControlFactory類別,以提供資料範本控制項上出現LightSwitch畫面。 類別包含GetDisplayModeDataTemplate函式,它會傳回唯讀版本的控制項時,它的資料不正在編輯中DataGrid。
在Constants一節的ControlFactory類別中,新增唯讀資料範本。 A TextBlock會顯示文字,而不是TextBox。 如範例中,會以紅色顯示的文字:
' control template for datagrid display mode
Private Const DisplayModeControlTemplate As String = "<DataTemplate" + " xmlns='https://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>"
// control template for datagrid display mode
private const string DisplayModeControlTemplate =
"<DataTemplate" +
" xmlns='https://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>";
在GetDisplayModeDataTemplate函式的ControlFactory,傳回剛定義唯讀範本:
Public Function GetDisplayModeDataTemplate(contentItem As IContentItem) As DataTemplate
' provide the display mode template
If Me.displayModeDataTemplate Is Nothing Then
Me.displayModeDataTemplate = TryCast(XamlReader.Load(MyControlFactory.DisplayModeControlTemplate), DataTemplate)
End If
Return Me.displayModeDataTemplate
End Function
Private displayModeDataTemplate As DataTemplate
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時控制項仍在使用它顯示模式的範本。 在此大小寫中, LightSwitchDataGrid會控制代碼切換至編輯模式的範本。 若要確定任何字元都會遺失,當發生此參數, DataGrid會快取任何輸入的文字。
在程式碼中的後置類別的控制項 (不ControlFactory類別),實作ISupportTextInput介面,並加入下列的實作方法。 這個方法確保新的輸入取代舊的文字,並設定至新的文字結尾的資料指標,讓使用者可以繼續輸入。
Private Sub ISupportTextInput_SetText(text As String) Implements ISupportTextInput.SetText
If Me.TextBox IsNot Nothing Then
Me.TextBox.Text = text
Me.TextBox.SelectionStart = text.Length
End If
End Sub
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>
藉由新增此旗標,您可以變更是否在某些情況下會出現這個控制項。
提供兩個編輯器控制項和檢視器控制項
常見的模式,就是控制項的兩個版本。 一種版本可以讓編輯資料 (「編輯器」),和一個版本只會顯示資料的檢視 ([工具])。 Examples include AddressEditor/AddressViewer and TextBox/Label.
編輯器控制項,以便顯示唯讀資料不同於檢視器控制項,以便顯示唯讀資料。 多個編輯器控制項無法在唯讀狀態。 所有的可編輯控制項必須支援唯讀模式 (IContentItem.IsReadOnly),即使它們具有放大的成對的檢視器控制項。 此唯讀模式通常但並不一定會與檢視器版本不同。
當第一次載入一個畫面時, LightSwitch決定螢幕上的所有內容項目的都使用哪個控制項。 如果開發人員尚未指定要使用的特定控制項,預設檢視的對應組用來判斷節點的預設控制項中。 這項評估根據包含父系的控制項繫結資料的結構描述中的幾個因素 (例如它是否計算的欄位,唯讀資料庫資料表或檢視表),及設定的Use Read-Only Controls屬性。 這些因素決定在執行階段,而且您無法在執行階段進行變更。 根據下列幾點,檢視器控制項或編輯器控制項將被選取,如果這兩者可以使用。
其他因素可以在執行階段變更,例如IsReadOnly屬性, X_IsReadOnly實體]欄位中,或授權設定的屬性會根據使用者程式碼,以及其他因素。 在執行階段永遠不會變更內容項目目的控制項。 因此,如果已選取編輯器控制項,它可能會出現在唯讀模式會根據這些因素。 如果檢視器] 已選取在畫面載入期間或開發人員在設計階段指定的檢視器 」,「 檢視器 」 應該忽略IContentItem.IsReadOnly而且永遠不會啟用 [編輯。
當您建立一對商務類型的控制項,您可以設定的預設對應,以便將選取 「 檢視器 」 或 「編輯器,當開發人員尚未指定的控制項。
編輯器和檢視器控制項通常會共用的內容。 例如, ImageViewer和ImageEditor這兩個控制項都會公開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檢視器] 上的屬性和只有屬性繼承自基底控制項。 其他屬性,例如AttachedLabelSupport的SupportedDataTypes,不繼承的。 在此大小寫中,屬性識別碼不MyModule:MyBaseControl/Properties[MyCommonProperty]。