類型化樣式
類型化樣式允許您用簡化的方式定義元素樣式。
從v.17.2開始,Devexpress WPF訂閱提供了DevExpress.Xpf.TypedStyles 程序集,其中包含以下控件的類型化樣式:
- 用于WPF基礎程序集(WindowsBase, PresentationCore, PresentationFramework)中的控件。
- DevExpress WPF控件。
類型化樣式與常規樣式
下圖展示了常規樣式和打字樣式的區別。

要為多個按鈕設置常規樣式,您應該使用TargetType=Button實現style,并在單獨的Setter中指定每個屬性。
typed style允許用以下方式為所有按鈕定義樣式:
創建一個名為{ElementName}Style的新資源,其中{ElementName}是目標類型。
- 例如:ButtonStyle用于標準的Button控件,GridControlStyle用于DevExpress的GridControl。
- 直接定義不帶設置符的屬性值,定義 typed style‘s x:Name屬性。
- 將 typed style指定為與常規樣式相同的控件。
支持的功能
類型化樣式支持所有常規樣式特性。
附加屬性
附加屬性在MergedStyles屬性中收集:
XAML:
<BorderStyle x:Key="styleWithAttachedProperties"> <KeyboardNavigationStyle IsTabStop="False" /> <FocusManagerStyle IsFocusScope="False" /> <TextBlockStyle FontSize="13" FontWeight="Bold"/> </BorderStyle>
事件
您可以指定沒有EventSetters的事件處理程序:
<BorderStyle x:Key="styleWithEvents" Loaded="BorderStyle_Loaded"/>
標記擴展
立即返回值的標記擴展(除了BindingBase和DynamicResoureExtension)可以在類型化樣式中用常規方式使用:
<SolidColorBrush x:Key="greenBrush">Green</SolidColorBrush> <ButtonStyle x:Key="styleWithMarkupExtensions" BorderBrush="{StaticResource greenBrush}" Foreground="{x:Null}" />
為BindingBase和DynamicResourceExtension標記擴展使用“*_Source”屬性:
<ButtonStyle x:Key="styleWithExpressionExtensions" Content_Source="{Binding FirstName}" Tag_Source="{DynamicResource tag}" />
點擊復制
DevExpress擴展 (DXBinding/DXEvent/DXCommand)
DXBinding/DXCommand與類型化樣式無縫配合。
<ButtonStyle x:Key="styleWithDXBinding" Content_Source="{DXBinding 'FirstName + @Self.Tag + $Button.TemplateProperty.Name'}" Tag="tag" Command_Source="{DXCommand 'Click()'}"/>
提示:DXEvent不能用于類型化樣式。
基本樣式
您可以用下面的方式定義基本樣式:
<ButtonBaseStyle x:Key="baseStyle" Background="Red" /> <ButtonStyle x:Key="styleWithBaseStyle" BasedOn="{StaticResource baseStyle}" ClickMode="Hover"/>
設置器
您可以通過填充*Style.Setters集合來使用常規設置器。
<ButtonStyle x:Key="styleWithStandardSetters"> <ButtonStyle.Setters> <Setter Property="DockPanel.Dock" Value="Bottom" /> </ButtonStyle.Setters> </ButtonStyle>
隱式風格
要定義隱式樣式,使用x:Key代替TargetType:
<ToggleButtonStyle x:Key="{x:Type ToggleButton}" Width="153" />
目標類型在內部設置為類型化樣式,因此不應該手動設置。例如,要為ListBox定義VirtualizingPanelStyle,您需要首先定義ListBoxStyle。
<ListBoxStyle x:Key="virtualizingStyle"> <VirtualizingPanelStyle IsVirtualizing="True" /> </ListBoxStyle>
觸發器
除了類型化的樣式,DevExpress.Xpf.TypedStyles程序集還包含每個支持的控件的類型化觸發器:
<ButtonStyle x:Key="styleWithTriggers" Margin="1,2,3,4"> <ButtonStyle.Triggers> <ButtonTrigger Visibility="Hidden" IsMouseOver="True"> <TextBlockStyle FontSize="13" /> </ButtonTrigger> </ButtonStyle.Triggers> </ButtonStyle>
您可以在模板中使用類型化觸發器。要做到這一點,指定類型觸發器的SourceName或TemplateName屬性:
<ControlTemplate x:Key="templateWithTriggers" TargetType="Button"> <TextBlock x:Name="textBlock" /> <ControlTemplate.Triggers> <TextBlockTrigger FontWeight="Black" SourceName="textBlock"> <TextBlockStyle TargetName="textBlock" FontStyle="Oblique"/> </TextBlockTrigger> </ControlTemplate.Triggers> </ControlTemplate>
如果您為多個源對象創建觸發器,則可以定義多個觸發器:
<ControlTemplate x:Key="templateWithDifferentSourceNamesTriggers" TargetType="Button"> <StackPanel> <TextBlock x:Name="textBlock1" /> <TextBlock x:Name="textBlock2" /> </StackPanel> <ControlTemplate.Triggers> <ButtonTrigger> <ButtonTrigger.Triggers> <MultiTriggerCollection> <TextBlockTrigger IsMouseOver="True" SourceName="textBlock1"/> <TextBlockTrigger IsKeyboardFocusWithin="True" SourceName="textBlock2"/> </MultiTriggerCollection> </ButtonTrigger.Triggers> <TextBlockStyle FontWeight="Bold"/> </ButtonTrigger> </ControlTemplate.Triggers> </ControlTemplate>
數據觸發
使用TypedDataTrigger將類型樣式與數據觸發器一起使用。
<ButtonStyle x:Key="styleWithDataTriggers" Margin="1,2,3,4"> <ButtonStyle.Triggers> <TypedDataTrigger Binding="{Binding FirstName}" Value="Jon"> <TextBlockStyle FontSize="13" /> </TypedDataTrigger> </ButtonStyle.Triggers> </ButtonStyle>
在代碼中使用
引用和名稱空間
所有類型樣式和觸發器都在{Corresponding control namespace}.TypedStyles中實現。
示例:ButtonStyle - System.Windows.Controls.TypedStyles
typed styles的XAML名稱空間與相應控件的名稱空間相同,您不需要添加任何額外的名稱空間引用。要使用 typed styles,請在項目中引用DevExpress.Xpf.TypedStyles程序集。
限制
Visual Studio和Blend不支持類型化樣式,在編輯XAML時使用類型化樣式。
不能將類型化樣式應用于泛型類型元素或其后代(例如,應用于DXTabControl或Wizard類),將此元素使用常規樣式作為TargetType。
表演
類型化樣式的性能與常規樣式相當。
以下常規樣式在測試機上應用200ms:
<Style x:Key="style00" TargetType="Button"> <Setter Property="FontFamily" Value="CourierNew"/> <Setter Property="FontSize" Value="12"/> <Setter Property="FocusVisualStyle" Value="{x:Null}"/> <Setter Property="Focusable" Value="False"/> <Setter Property="Content" Value="test"/> <Setter Property="Background" Value="Red"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Margin" Value="1,2,3,4"/> <Setter Property="Cursor" Value="Hand"/> </Style>
下面通過類型化樣式實現的模擬在測試機上應用了130毫秒:
<ButtonStyle x:Key="style00" FontFamily="CourierNew" FontSize="12" FocusVisualStyle="{x:Null}" Focusable="False" Content="test" Background="Red" BorderThickness="1" Margin="1,2,3,4" Cursor="Hand" />