样式
实例:
<Window.Resources> <Style x:Key="BtnStyle"> <Setter Property="Button.Height" Value="50" /> <Setter Property="Button.Margin" Value="30" /> <Setter Property="Button.Background" Value="Beige" /> <Setter Property="Button.RenderTransform"> <Setter.Value> <RotateTransform Angle="45" /> </Setter.Value> </Setter> </Style> </Window.Resources> <WrapPanel x:Name="wrappanel" Margin="10"> <Button Content="btn1" Style="{StaticResource BtnStyle}" /> <Button Content="btn2" Style="{StaticResource BtnStyle}" /> <Button Content="btn3" Style="{StaticResource BtnStyle}" /> </WrapPanel>
如果不设置样式,需要每个控件都添加重复的代码,比较繁琐。
可以设置Style的TargetType,并且可以不设置x:Key,会默认应用到符合的控件上,需要注意Scope,在定义的Scope内才会生效
<Style TargetType="{x:Type Button}"> <Setter Property="Height" Value="50" /> <Setter Property="Margin" Value="30" /> <Setter Property="Background" Value="Beige" /> <Setter Property="RenderTransform"> <Setter.Value> <RotateTransform Angle="45" /> </Setter.Value> </Setter> </Style>
<Button Content="btn1" />
样式具有继承机制
如果有不同类型的空间,希望共用一部分样式设置,可以通过BasedOn实现
<Window.Resources> <Style TargetType="{x:Type Control}"> ... </Style> <Style BasedOn="{StaticResource {x:Type Control}}" TargetType="{x:Type Button}"> ... </Style> <Style BasedOn="{StaticResource {x:Type Control}}" TargetType="{x:Type RadioButton}"> ... </Style> </Window.Resources>
Style有一个Trigger集合,下面的例子是一个属性触发器
<Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red"></Setter> </Trigger> </Style.Triggers>
WPF有3中触发器
属性触发器,属性改变时执行触发器中的Setter集合
数据触发器,.net属性,不只依赖属性改变
事件触发器,触发路由事件时执行
实现一个ListBox
<Page.Resources> <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Book"> <x:XData> <Inventory xmlns=""> <Book> <Chapter Number="1"> <Title>Chapter A</Title> </Chapter> <Chapter Number="2"> <Title>Chapter B</Title> </Chapter> <Chapter Number="3"> <Title>Chapter C</Title> </Chapter> <Chapter Number="4"> <Title>Chapter D</Title> </Chapter> <Chapter Number="5"> <Title>Chapter E</Title> </Chapter> </Book> </Inventory> </x:XData> </XmlDataProvider> </Page.Resources> <StackPanel Margin="20"> <ListBox HorizontalAlignment="Center" Padding="2"> <ListBox.ItemsSource> <Binding Source="{StaticResource InventoryData}" XPath="*" /> </ListBox.ItemsSource> <ListBox.ItemTemplate> <DataTemplate> <TextBlock FontSize="20" Margin="5"> <TextBlock.Text> <Binding XPath="Title" /> </TextBlock.Text> </TextBlock> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel>
为ListBox添加一个从透明到清晰的动画,通过事件触发器实现
<ListBox.Triggers> <EventTrigger RoutedEvent="ListBox.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:5" /> </Storyboard> </BeginStoryboard> </EventTrigger> </ListBox.Triggers>
根据Number属性设置颜色
<Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Margin" Value="2" /> <Setter Property="Padding" Value="2" /> <Style.Triggers> <DataTrigger Binding="{Binding XPath=@Number}" Value="3"> <Setter Property="TextBlock.Foreground" Value="Red" /> </DataTrigger> <DataTrigger Binding="{Binding XPath=@Number}" Value="4"> <Setter Property="TextBlock.Foreground" Value="Blue" /> </DataTrigger> </Style.Triggers> </Style>
To be continue...