宝塔面板做网站绑定域名,指数基金怎么选,百度代理公司怎么样,网站域名做链接怎么做以前在设置控件样式或自定义控件时#xff0c;都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。
像这样#xff1a; Style TargetTypeListBoxItemSetter PropertyOpacity Value0.5 /Setter …以前在设置控件样式或自定义控件时都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。
像这样 Style TargetTypeListBoxItemSetter PropertyOpacity Value0.5 /Setter PropertyMaxHeight Value75 /Style.TriggersTrigger PropertyIsSelected ValueTrueTrigger.SettersSetter PropertyOpacity Value1.0 //Trigger.Setters/Trigger/Style.Triggers/Style 还可以使用VisualState类来进行样式更改
VisualState类实现了可以让控件始终处于特定的状态的功能。例如当鼠标在控件的表面上移动时该控件被视为处于MouseOver状态。 没有特定状态的控件被视为处于 Normal 状态。
状态分为多个组前面提到的MouseMove状态和Normal属于 CommonStates 状态组(VisualStateGroup)。 大多数控件都有两个状态组CommonStates和 FocusStates。
在应用于控件的每个状态组中控件始终处于每个组的一种状态。但是控件不能处于同一组中的两种不同状态。
完整的状态可以参照下表
VisualState 名称VisualStateGroup 名称描述NormalCommonStates默认状态。MouseOverCommonStates鼠标指针悬停在控件上方。PressedCommonStates已按下控件。DisabledCommonStates已禁用控件。FocusedFocusStates控件有焦点。UnfocusedFocusStates控件没有焦点。 注意
1、VisaulState只适用于状态改变需要过渡动画的情况如果不想实现过渡效果推荐使用触发器。
2、如果要查找WPF附带控件可视状态(VisualState)的名称可参阅控件源码。(https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/control-styles-and-templates) 下面我们使用VisualState类来自定义一个Button样式
1、使用Visual Studio 2019创建一个.Net Core WPF程序 2、在MainWindow中添加两个Button控件第一个button用于展示状态第二个button用于模拟控制第一个按钮的状态 1 Window x:ClassVisualStateDemo.MainWindow2 xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation3 xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml4 xmlns:dhttp://schemas.microsoft.com/expression/blend/20085 xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/20066 xmlns:localclr-namespace:VisualStateDemo7 mc:Ignorabled8 TitleMainWindow Height450 Width800 9 StackPanel
10 Button Contentbutton1 HorizontalAlignmentCenter VerticalAlignmentCenter Width88 Height26 Namebtn/
11 Button Contentbutton2(make button 1 to Pressed state) HorizontalAlignmentCenter VerticalAlignmentBottom Height26 Namebtn_2 Clickbtn_2_Click/
12 /StackPanel
13 /Window 3、在Windows.Resources下定义样式如下 1 Window.Resources2 Style TargetType{x:Type Button}3 Setter PropertyBorderBrush ValueTransparent/4 Setter PropertyBackground ValueBlack/5 Setter PropertyForeground ValueWhite/6 7 Setter PropertyTemplate8 Setter.Value9 ControlTemplate TargetType{x:Type Button}
10 Border BorderThickness{TemplateBinding Border.BorderThickness} BorderBrush{TemplateBinding Border.BorderBrush} Background{TemplateBinding Panel.Background} Nameborder SnapsToDevicePixelsTrue CornerRadius5
11 VisualStateManager.VisualStateGroups
12 VisualStateGroup NameCommonStates
13 VisualState NameNormal
14 Storyboard
15 ColorAnimation Storyboard.TargetNameborder
16 Storyboard.TargetProperty(Border.Background).(SolidColorBrush.Color)
17 To{TemplateBinding Background}
18 Duration0:0:0.3/
19 /Storyboard
20 /VisualState
21 VisualState NameMouseOver
22 Storyboard
23 ColorAnimation Storyboard.TargetNameborder
24 Storyboard.TargetProperty(Border.Background).(SolidColorBrush.Color)
25 ToSilver
26 Duration0:0:0.3/
27 /Storyboard
28 /VisualState
29 VisualState NamePressed
30 Storyboard
31 ColorAnimation Storyboard.TargetNameborder Storyboard.TargetProperty(Border.Background).(SolidColorBrush.Color) To#7b8488 Duration0:0:0.3/
32 /Storyboard
33 /VisualState
34 /VisualStateGroup
35 /VisualStateManager.VisualStateGroups
36 ContentPresenter RecognizesAccessKeyTrue Content{TemplateBinding ContentControl.Content} ContentTemplate{TemplateBinding ContentControl.ContentTemplate} ContentStringFormat{TemplateBinding ContentControl.ContentStringFormat} NamecontentPresenter Margin{TemplateBinding Control.Padding} HorizontalAlignment{TemplateBinding Control.HorizontalContentAlignment} VerticalAlignment{TemplateBinding Control.VerticalContentAlignment} SnapsToDevicePixels{TemplateBinding UIElement.SnapsToDevicePixels} FocusableFalse /
37 /Border
38 /ControlTemplate
39 /Setter.Value
40 /Setter
41 /Style
42 /Window.Resources 4、运行效果如下 5、使用代码控制VisualState
调用System.Windows.VisualStateManager.GoToState函数可以指定控件的状态。
在按钮2的单击事件中添加以下代码
1 private void btn_2_Click(object sender, RoutedEventArgs e)
2 {
3 System.Windows.VisualStateManager.GoToState(btn, Pressed, false);
4 }
如果是自定义控件直接将控件名换成this即可
1 System.Windows.VisualStateManager.GoToState(this, Pressed, false); 注意
如果在ControlTemplate中使用 VisualStateManager应该调用 GoToState 方法。
如果在ControlTemplate 外使用 VisualStateManager 例如如果在 UserControl 中或在单个元素中使用 VisualStateManager应该调用 GoToElementState 方法。 示例代码