類型化樣式
類型化樣式允許您用簡化的方式定義元素樣式。
從v.17.2開始,Devexpress WPF訂閱提供了DevExpress.Xpf.TypedStyles 程序集,其中包含以下控件的類型化樣式:
- 用于WPF基礎(chǔ)程序集(WindowsBase, PresentationCore, PresentationFramework)中的控件。
- DevExpress WPF控件。
類型化樣式與常規(guī)樣式
下圖展示了常規(guī)樣式和打字樣式的區(qū)別。
要為多個(gè)按鈕設(shè)置常規(guī)樣式,您應(yīng)該使用TargetType=Button實(shí)現(xiàn)style,并在單獨(dú)的Setter中指定每個(gè)屬性。
typed style允許用以下方式為所有按鈕定義樣式:
創(chuàng)建一個(gè)名為{ElementName}Style的新資源,其中{ElementName}是目標(biāo)類型。
- 例如:ButtonStyle用于標(biāo)準(zhǔn)的Button控件,GridControlStyle用于DevExpress的GridControl。
- 直接定義不帶設(shè)置符的屬性值,定義 typed style‘s x:Name屬性。
- 將 typed style指定為與常規(guī)樣式相同的控件。
支持的功能
類型化樣式支持所有常規(guī)樣式特性。
附加屬性
附加屬性在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"/>
標(biāo)記擴(kuò)展
立即返回值的標(biāo)記擴(kuò)展(除了BindingBase和DynamicResoureExtension)可以在類型化樣式中用常規(guī)方式使用:
<SolidColorBrush x:Key="greenBrush">Green</SolidColorBrush> <ButtonStyle x:Key="styleWithMarkupExtensions" BorderBrush="{StaticResource greenBrush}" Foreground="{x:Null}" />
為BindingBase和DynamicResourceExtension標(biāo)記擴(kuò)展使用“*_Source”屬性:
<ButtonStyle x:Key="styleWithExpressionExtensions" Content_Source="{Binding FirstName}" Tag_Source="{DynamicResource tag}" />
點(diǎn)擊復(fù)制
DevExpress擴(kuò)展 (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"/>
設(shè)置器
您可以通過填充*Style.Setters集合來使用常規(guī)設(shè)置器。
<ButtonStyle x:Key="styleWithStandardSetters"> <ButtonStyle.Setters> <Setter Property="DockPanel.Dock" Value="Bottom" /> </ButtonStyle.Setters> </ButtonStyle>
隱式風(fēng)格
要定義隱式樣式,使用x:Key代替TargetType:
<ToggleButtonStyle x:Key="{x:Type ToggleButton}" Width="153" />
目標(biāo)類型在內(nèi)部設(shè)置為類型化樣式,因此不應(yīng)該手動(dòng)設(shè)置。例如,要為ListBox定義VirtualizingPanelStyle,您需要首先定義ListBoxStyle。
<ListBoxStyle x:Key="virtualizingStyle"> <VirtualizingPanelStyle IsVirtualizing="True" /> </ListBoxStyle>
觸發(fā)器
除了類型化的樣式,DevExpress.Xpf.TypedStyles程序集還包含每個(gè)支持的控件的類型化觸發(fā)器:
<ButtonStyle x:Key="styleWithTriggers" Margin="1,2,3,4"> <ButtonStyle.Triggers> <ButtonTrigger Visibility="Hidden" IsMouseOver="True"> <TextBlockStyle FontSize="13" /> </ButtonTrigger> </ButtonStyle.Triggers> </ButtonStyle>
您可以在模板中使用類型化觸發(fā)器。要做到這一點(diǎn),指定類型觸發(fā)器的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>
如果您為多個(gè)源對象創(chuàng)建觸發(fā)器,則可以定義多個(gè)觸發(fā)器:
<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>
數(shù)據(jù)觸發(fā)
使用TypedDataTrigger將類型樣式與數(shù)據(jù)觸發(fā)器一起使用。
<ButtonStyle x:Key="styleWithDataTriggers" Margin="1,2,3,4"> <ButtonStyle.Triggers> <TypedDataTrigger Binding="{Binding FirstName}" Value="Jon"> <TextBlockStyle FontSize="13" /> </TypedDataTrigger> </ButtonStyle.Triggers> </ButtonStyle>
在代碼中使用
引用和名稱空間
所有類型樣式和觸發(fā)器都在{Corresponding control namespace}.TypedStyles中實(shí)現(xiàn)。
示例:ButtonStyle - System.Windows.Controls.TypedStyles
typed styles的XAML名稱空間與相應(yīng)控件的名稱空間相同,您不需要添加任何額外的名稱空間引用。要使用 typed styles,請?jiān)陧?xiàng)目中引用DevExpress.Xpf.TypedStyles程序集。
限制
Visual Studio和Blend不支持類型化樣式,在編輯XAML時(shí)使用類型化樣式。
不能將類型化樣式應(yīng)用于泛型類型元素或其后代(例如,應(yīng)用于DXTabControl或Wizard類),將此元素使用常規(guī)樣式作為TargetType。
表演
類型化樣式的性能與常規(guī)樣式相當(dāng)。
以下常規(guī)樣式在測試機(jī)上應(yīng)用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>
下面通過類型化樣式實(shí)現(xiàn)的模擬在測試機(jī)上應(yīng)用了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" />