第九章-资源与样式
1、创建资源与作用范围
其作用范围的优先级为控件>窗体>应用程序
作用于整体窗口或某个控件的定义方法;
<!--窗口资源,该资源作用于整个窗口--> <Window.Resources> <!--样式资源,如果没有写x:Key属性,那么该资源对所有为该目标类型的控件均起作用--> <Style TargetType="Button" x:Key="btn_Style"> <Setter Property="Background" Value="Red"></Setter> <Setter Property="FontSize" Value="20"></Setter> <Setter Property="Foreground" Value="White"></Setter> </Style> </Window.Resources> <StackPanel> <!--未指定Key时,不起作用--> <Button Width="60" Height="30"></Button> <!--使用资源--> <Button Width="60" Height="30" Margin="10" Style="{StaticResource btn_Style}"></Button> <Button Width="60" Height="30" Margin="10"> <!--按钮资源,仅作用于该Buttton--> <Button.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Wheat"></Setter> <Setter Property="FontSize" Value="30"></Setter> <Setter Property="Foreground" Value="White"></Setter> </Style> </Button.Resources> </Button> </StackPanel>
作用于整个应用程序的资源定义:
添加资源字典(实际还是xaml文件)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style TargetType="Button" x:Key="btn_Style"> <Setter Property="Background" Value="Red"></Setter> <Setter Property="FontSize" Value="20"></Setter> <Setter Property="Foreground" Value="White"></Setter> </Style> </ResourceDictionary>
使其作用于整个应用程序:在App.xaml文件当中修改
<ResourceDictionary> <!--资源合并--> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resource/Btn_Style.xmal"></ResourceDictionary> <!--后面可继续添加多个资源--> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
窗口当中使用资源
<Button Width="60" Height="30" Margin="10" Style="{StaticResource btn_Style}"></Button>
静态资源与动态资源
动态资源可以被后台代码修改样式后立即起作用
2、样式
2.1 样式的属性
Setters:设置属性值以及自动关联事件处理程序的Setter对象或EventSetter对象的集合
Triggers:继承自TriggerBase类并能自动改变样式设置的对象集合。例如,当另一个属性改变时,或者当发生某个事件时,可以修改样式
Resources:希望用于样式的资源集合。例如,可能需要使用一个对象没置多个属性。这时,更高效的做法是作为资源创建对象,然后在Setter对象中使用该资源(而不是使用嵌套的标签作为每个Setter对象的一部分创建对象)
BasedOn:通过该属性可创建继承自(并且可以有选择地进行重写)其他详情操作单具体样式
TargetType:该属性标识应用样式的元素的类型。通过该属性可创建只影响特定类型元素的设置器,还可以创建能够为恰当的元素类型自动起作用的设置器
2.2 使用样式对象Style
<Style TargetType="Button"> <Setter Property="FontSize" Value="20"></Setter> <Setter Property="Background" Value="Red"></Setter> </Style>
2.3 样式的继承BasedOn
<Style x:Key="btn_style" TargetType="Button"> <Setter Property="FontSize" Value="30"></Setter> <Setter Property="Background" Value="Red"></Setter> </Style> <Style TargetType="Button" x:Key="btn_StyleSon" BasedOn="{StaticResource btn_style}"> <Setter Property="Foreground" Value="Blue"></Setter> <Setter Property="FontWeight" Value="Bold"></Setter> </Style>
3、触发器
简单触发器:一般用于修改样式值
<Style x:Key="btn_style" TargetType="Button"> <!--Setrwes可省略--> <Style.Setters> <Setter Property="FontSize" Value="30"></Setter> <Setter Property="Background" Value="Red"></Setter> </Style.Setters> <!--Triggers不可省略--> <Style.Triggers> <!--触发时机, IsMouseOver:鼠标悬停 IsPressed:鼠标按下 --> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontSize" Value="20"></Setter> <Setter Property="Background" Value="BlueViolet"></Setter> </Trigger> </Style.Triggers> </Style>
多条件触发:
<!--多条件触发--> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True"></Condition> <Condition Property="IsPressed" Value="True"></Condition> </MultiTrigger.Conditions> <MultiTrigger.Setters> <Setter Property="FontSize" Value="5"></Setter> <Setter Property="Background" Value="Blue"></Setter> </MultiTrigger.Setters> </MultiTrigger> </Style.Triggers>
·
事件触发器
适合于复杂的、动画效果
<Style.Triggers> <EventTrigger RoutedEvent="MouseEnter"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="FontSize" To="60"></DoubleAnimation> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Style.Triggers>
4、行为
是一类事物的共同特征,可以向用户界面添加功能
功能是在行为类当中实现的,并附加到控件上,使得它像控件的一部分
/// <summary> /// Microsoft.Xaml.Behaviors.Wpf /// 自定义行为:实现拖拽功能 /// </summary> public class CustBehavior :Behavior<UIElement> { /// <summary> /// 添加功能 /// </summary> protected override void OnAttached() { base.OnAttached(); //鼠标左键按下,鼠标移动,鼠标左键放开 this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown; this.AssociatedObject.MouseMove += AssociatedObject_MouseMove; this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp; } protected override void OnDetaching() { base.OnDetaching(); this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown; this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove; this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp; } private bool IsMove = false; private Point startPoint;//起始坐标 private Canvas canvas;//移动元素所在画布 /// <summary> /// 鼠标左键松开 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <exception cref="NotImplementedException"></exception> private void AssociatedObject_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { IsMove = false; Mouse.Capture(null); } /// <summary> /// 鼠标左键移动 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <exception cref="NotImplementedException"></exception> private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { //1、鼠标是否单击左键、并且没有松开 if(IsMove) { //2、移动 Point nowPoint = e.GetPosition(canvas); //鼠标在画布的坐标 AssociatedObject.SetValue(Canvas.LeftProperty,nowPoint.X-startPoint.X); AssociatedObject.SetValue(Canvas.TopProperty, nowPoint.Y - startPoint.Y); } } /// <summary> /// 鼠标左键按下 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <exception cref="NotImplementedException"></exception> private void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { //1、能够移动 IsMove = true; //2、记录起始坐标 startPoint = e.GetPosition(AssociatedObject); //3、移动元素捕获鼠标 Mouse.Capture(AssociatedObject); //4、移动元素所在画布 if (canvas == null) { canvas = VisualTreeHelper.GetParent(AssociatedObject) as Canvas; } } }
浙公网安备 33010602011771号