WPF 使用Trigger遇到的问题
1. 在style中使用trigger无效的场景
原因是直接在对象上设置值将导致style中的值无效,去掉TextBlock对象的Foreground后,Trigger将正常工作
<TextBlock Text="AAA" Foreground="Black" >
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Orange"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Foreground" Value="Red"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
2.ControlTemplate 的Trigger
假如有以下需求:
1.需要自定义一个IconButton,他有两个主要依赖属性:Icon和Header,属性类型为Object
2.鼠标滑过IconButton时,可以修改背景色和前景色
代码:
<!--使用了Object和MouseOverObject两个对象,是为了处理图片的切换,比如美工针对鼠标进入和离开两种场景提供了两张图片,Header也类似,以及其他场景,如下:-->
<localControls:IconButton Height="" Width="" HeaderWidth="*"
Icon="MMM" MouseOverForeground="White" MouseOverBackground="Black">
<localControls:IconButton.Header>
<Border>
<TextBlock Text="asdfasdf"></TextBlock>
</Border>
</localControls:IconButton.Header>
<localControls:IconButton.MouseOverHeader>
<TextBlock Foreground="Orange" Text="MouseONver"></TextBlock>
</localControls:IconButton.MouseOverHeader>
</localControls:IconButton>
<Style x:Key="IconButtonStyle" TargetType="{x:Type localControls:IconButton}">
<!--Foreground这个属性,如果直接在IconButton对象上设置Foreground默认值,将导致Trigger无效,所以添加了NormalForeground-->
<Setter Property="NormalBackground" Value="Gray"></Setter>
<Setter Property="NormalForeground" Value="Black"></Setter>
<Setter Property="MouseOverBackground" Value="{Binding NormalBackground, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="MouseOverForeground" Value="{Binding NormalForeground, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="MouseOverIcon" Value="{Binding Icon, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="MouseOverHeader" Value="{Binding Header, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="DisabledBackground" Value="{Binding NormalBackground, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="DisabledForeground" Value="{Binding NormalForeground, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="DisabledIcon" Value="{Binding Icon, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="DisabledHeader" Value="{Binding Header, RelativeSource={RelativeSource Self}}"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type localControls:IconButton}">
<Border x:Name="TemplateRoot" Background="{TemplateBinding NormalBackground}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{TemplateBinding IconWidth}"></ColumnDefinition>
<ColumnDefinition Width="{TemplateBinding HeaderWidth}"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="IconContentSite"
Content="{TemplateBinding Icon}"
Margin="{TemplateBinding IconMargin}"
HorizontalAlignment="{TemplateBinding IconHorizontalAlignment}"
VerticalAlignment="{TemplateBinding IconVerticalAlignment}"></ContentPresenter>
<ContentPresenter x:Name="HeaderContentSite" Grid.Column=""
Margin="{TemplateBinding HeaderMargin}"
HorizontalAlignment="{TemplateBinding HeaderHorizontalAlignment}"
VerticalAlignment="{TemplateBinding HeaderVerticalAlignment}"
Content="{TemplateBinding Header}"></ContentPresenter> </Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="IconContentSite" Property="Content" Value="{Binding MouseOverIcon,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<Setter TargetName="HeaderContentSite" Property="Content" Value="{Binding MouseOverHeader,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<Setter TargetName="TemplateRoot" Property="Background" Value="{Binding MouseOverBackground,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<!--因为是要设置IconButton的依赖属性值,所以不设置TargetName,并且Model为Self,如果为TemplateParent,将无法绑定到目标值,具体原因看MSDN关于此枚举的介绍-->
<Setter Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource={RelativeSource Self}}"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="false">
<Setter Property="Foreground" Value="{Binding NormalForeground,RelativeSource={RelativeSource Self}}"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="IconContentSite" Property="Content" Value="{Binding DisabledIcon,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<Setter TargetName="HeaderContentSite" Property="Content" Value="{Binding DisabledHeader,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<Setter TargetName="TemplateRoot" Property="Background" Value="{Binding DisabledBackground,RelativeSource={RelativeSource TemplatedParent}}"></Setter>
<Setter Property="Foreground" Value="{Binding DisabledForeground,RelativeSource={RelativeSource Self}}"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
public class IconButton : Control
{
public IconButton()
{
} #region DependencyProperty
public object Icon
{
get { return (object)GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
} // Using a DependencyProperty as the backing store for Icon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("Icon", typeof(object), typeof(IconButton), new PropertyMetadata(null)); public Thickness IconMargin
{
get { return (Thickness)GetValue(IconMarginProperty); }
set { SetValue(IconMarginProperty, value); }
} // Using a DependencyProperty as the backing store for IconMargin. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconMarginProperty =
DependencyProperty.Register("IconMargin", typeof(Thickness), typeof(IconButton), new PropertyMetadata(new Thickness(0d))); public GridLength IconWidth
{
get { return (GridLength)GetValue(IconWidthProperty); }
set { SetValue(IconWidthProperty, value); }
} // Using a DependencyProperty as the backing store for IconWidth. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconWidthProperty =
DependencyProperty.Register("IconWidth", typeof(GridLength), typeof(IconButton), new PropertyMetadata(GridLength.Auto)); public HorizontalAlignment IconHorizontalAlignment
{
get { return (HorizontalAlignment)GetValue(IconHorizontalAlignmentProperty); }
set { SetValue(IconHorizontalAlignmentProperty, value); }
} // Using a DependencyProperty as the backing store for IconHorizontalAlignment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconHorizontalAlignmentProperty =
DependencyProperty.Register("IconHorizontalAlignment", typeof(HorizontalAlignment), typeof(IconButton), new PropertyMetadata(HorizontalAlignment.Center)); public VerticalAlignment IconVerticalAlignment
{
get { return (VerticalAlignment)GetValue(IconVerticalAlignmentProperty); }
set { SetValue(IconVerticalAlignmentProperty, value); }
} // Using a DependencyProperty as the backing store for IconVerticalAlignment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconVerticalAlignmentProperty =
DependencyProperty.Register("IconVerticalAlignment", typeof(VerticalAlignment), typeof(IconButton), new PropertyMetadata(VerticalAlignment.Center)); public object MouseOverIcon
{
get { return (object)GetValue(MouseOverIconProperty); }
set { SetValue(MouseOverIconProperty, value); }
} // Using a DependencyProperty as the backing store for MouseOverIcon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MouseOverIconProperty =
DependencyProperty.Register("MouseOverIcon", typeof(object), typeof(IconButton), new PropertyMetadata(null)); public object DisabledIcon
{
get { return (object)GetValue(DisabledIconProperty); }
set { SetValue(DisabledIconProperty, value); }
} // Using a DependencyProperty as the backing store for DisabledIcon. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DisabledIconProperty =
DependencyProperty.Register("DisabledIcon", typeof(object), typeof(IconButton), new PropertyMetadata()); public object Header
{
get { return (object)GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
} // Using a DependencyProperty as the backing store for Header. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(object), typeof(IconButton), new PropertyMetadata(null)); public Thickness HeaderMargin
{
get { return (Thickness)GetValue(HeaderMarginProperty); }
set { SetValue(HeaderMarginProperty, value); }
} // Using a DependencyProperty as the backing store for HeaderMargin. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderMarginProperty =
DependencyProperty.Register("HeaderMargin", typeof(Thickness), typeof(IconButton), new PropertyMetadata(new Thickness(0d))); public HorizontalAlignment HeaderHorizontalAlignment
{
get { return (HorizontalAlignment)GetValue(HeaderHorizontalAlignmentProperty); }
set { SetValue(HeaderHorizontalAlignmentProperty, value); }
} // Using a DependencyProperty as the backing store for HeaderHorizontalAlignment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderHorizontalAlignmentProperty =
DependencyProperty.Register("HeaderHorizontalAlignment", typeof(HorizontalAlignment), typeof(IconButton), new PropertyMetadata(HorizontalAlignment.Center)); public VerticalAlignment HeaderVerticalAlignment
{
get { return (VerticalAlignment)GetValue(HeaderVerticalAlignmentProperty); }
set { SetValue(HeaderVerticalAlignmentProperty, value); }
} // Using a DependencyProperty as the backing store for HeaderVerticalAlignment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderVerticalAlignmentProperty =
DependencyProperty.Register("HeaderVerticalAlignment", typeof(VerticalAlignment), typeof(IconButton), new PropertyMetadata(VerticalAlignment.Center)); public GridLength HeaderWidth
{
get { return (GridLength)GetValue(HeaderWidthProperty); }
set { SetValue(HeaderWidthProperty, value); }
} // Using a DependencyProperty as the backing store for HeaderWidth. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderWidthProperty =
DependencyProperty.Register("HeaderWidth", typeof(GridLength), typeof(IconButton), new PropertyMetadata(GridLength.Auto)); public object MouseOverHeader
{
get { return (object)GetValue(MouseOverHeaderProperty); }
set { SetValue(MouseOverHeaderProperty, value); }
} // Using a DependencyProperty as the backing store for MouseOverHeader. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MouseOverHeaderProperty =
DependencyProperty.Register("MouseOverHeader", typeof(object), typeof(IconButton), new PropertyMetadata(null)); public object DisabledHeader
{
get { return (object)GetValue(DisabledHeaderProperty); }
set { SetValue(DisabledHeaderProperty, value); }
} // Using a DependencyProperty as the backing store for DisabledHeader. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DisabledHeaderProperty =
DependencyProperty.Register("DisabledHeader", typeof(object), typeof(IconButton), new PropertyMetadata(null)); public Brush MouseOverBackground
{
get { return (Brush)GetValue(MouseOverBackgroundProperty); }
set { SetValue(MouseOverBackgroundProperty, value); }
} // Using a DependencyProperty as the backing store for MouseOverBackground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MouseOverBackgroundProperty =
DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(IconButton), new PropertyMetadata(null)); public Brush MouseOverForeground
{
get { return (Brush)GetValue(MouseOverForegroundProperty); }
set { SetValue(MouseOverForegroundProperty, value); }
} // Using a DependencyProperty as the backing store for MouseOverForeground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MouseOverForegroundProperty =
DependencyProperty.Register("MouseOverForeground", typeof(Brush), typeof(IconButton), new PropertyMetadata(new SolidColorBrush(Colors.Transparent))); public Brush NormalBackground
{
get { return (Brush)GetValue(NormalBackgroundProperty); }
set { SetValue(NormalBackgroundProperty, value); }
} // Using a DependencyProperty as the backing store for NormalBackground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NormalBackgroundProperty =
DependencyProperty.Register("NormalBackground", typeof(Brush), typeof(IconButton), new PropertyMetadata(null)); public Brush NormalForeground
{
get { return (Brush)GetValue(NormalForegroundProperty); }
set { SetValue(NormalForegroundProperty, value); }
} // Using a DependencyProperty as the backing store for NormalForeground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NormalForegroundProperty =
DependencyProperty.Register("NormalForeground", typeof(Brush), typeof(IconButton), new PropertyMetadata(null)); public Brush DisabledBackground
{
get { return (Brush)GetValue(DisabledBackgroundProperty); }
set { SetValue(DisabledBackgroundProperty, value); }
} // Using a DependencyProperty as the backing store for DisabledBackground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DisabledBackgroundProperty =
DependencyProperty.Register("DisabledBackground", typeof(Brush), typeof(IconButton), new PropertyMetadata(null)); public Brush DisabledForeground
{
get { return (Brush)GetValue(DisabledForegroundProperty); }
set { SetValue(DisabledForegroundProperty, value); }
} // Using a DependencyProperty as the backing store for DisabledForeground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DisabledForegroundProperty =
DependencyProperty.Register("DisabledForeground", typeof(Brush), typeof(IconButton), new PropertyMetadata(null));
#endregion }
WPF 使用Trigger遇到的问题的更多相关文章
- WPF 杂谈——Trigger触发器
笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...
- 如何在 UWP 使用 wpf 的 Trigger
本文需要告诉大家,如何使用 Behaviors 做出 WPF 的 Trigger ,需要知道 UWP 不支持 WPF 的 Trigger . 安装 Behaviors 请使用 Nuget 安装,可以输 ...
- WPF触发器(Trigger)
WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...
- WPF触发器(Trigger、DataTrigger、EventTrigger)
WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...
- WPF 基础 - Trigger
1. Trigger 1.1 由属性值触发的 Trigger 最基本的触发器,Property 是关注的属性名称,value 是触发条件,一旦触发条件满足,就会应用 Trigger 的 Setters ...
- WPF触发器(Trigger) - DataTrigger
官方文档中对DataTrigger的介绍 Represents a trigger that applies property values or performs actions when the ...
- WPF XAML Trigger中使用动画后 动画对象冻结的处理办法
在编写XAML时 在Trigger中使用动画,在动画之后,动画对象就会被冻结,无法被其他动画或者属性改变. 处理办法有: 1 使用附加属性来添加动画 public static readonly De ...
- 【WPF】使用 XAML 的 Trigger 系统实现三态按钮
利用 WPF 的 Trigger 系统,也可以很简单的只使用xmal实现三态按钮.在Window或UserControl的资源中声明按钮的style并加入触发功能.使用的时候直接在button里复写s ...
- Trigger和ViewStateManager的具体比较
ViewStateManager的好处 拥有 GeneratedDuration ,可以很方便的进行几个状态之间的切换过渡动画. 坏处是,在界面加载时只能显示默认效果,通过GoToStateActi ...
随机推荐
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(2)准备知识
一.变量为什么必须初始化? 在回答这个问题之前,我们先来运行一段代码: #include <stdio.h> int main(){ int i; printf("i=%d\n& ...
- 百度消息推送REST API探究
一.百度云推送介绍 云推送(Push)是百度开放云向开发者提供的消息推送服务:通过利用云端与客户端之间建立稳定.可靠的长连接来为开发者提供向客户端应用推送实时消息服务. 百度云推送服务支持推送三种类型 ...
- 微信小程序从零开始开发步骤(一)
从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了.1:注册用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,点击 ht ...
- CSS盒子模型中距离的通俗解释
设一个有两个div,一大一小,小的div在大的div里面,而小的div和大div直接的距离就叫外边距,用margin.margin-left.margin-right.margin-top.margi ...
- Vagi单点登录1.0
Vagi是一款基于CAS(CAS v4)的Web应用单点登录系统.(cas web https://github.com/Jasig/cas) 对数据库用户存储支持 加入登录验证码 新浪微博和QQ互联 ...
- TEdit,TMemo背景透明(SetWindowLong(WS_EX_TRANSPARENT)增加透明风格)
The component below works perfectly, except for the following problem: 1) Saves the component below ...
- pycharm输出乱码如\xe9\x9d\x92\xe8\x9b\x99\xe7\x8e\x8b\xe5\xad\x90转成中文
转自:https://blog.csdn.net/baidu_19473529/article/details/54949453 利用Python解决unicode编码问题,有些json在控制台打印也 ...
- java做微信支付notify_url异步通知服务端的写法
最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...
- Method and apparatus for encoding data to be self-describing by storing tag records describing said data terminated by a self-referential record
A computer-implemented method and apparatus in a computer system of processing data generated by a f ...
- 使用JScript脚本批量修改VC工程设置
作者:朱金灿 来源:http://blog.csdn.net/clever101 很多时候升级了第三方库,需要对很多工程修改设置.在VS中按住Ctrl键确实可以多选工程,但通过这样做也有麻烦的地方:一 ...