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遇到的问题的更多相关文章

  1. WPF 杂谈——Trigger触发器

    笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...

  2. 如何在 UWP 使用 wpf 的 Trigger

    本文需要告诉大家,如何使用 Behaviors 做出 WPF 的 Trigger ,需要知道 UWP 不支持 WPF 的 Trigger . 安装 Behaviors 请使用 Nuget 安装,可以输 ...

  3. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

  4. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  5. WPF 基础 - Trigger

    1. Trigger 1.1 由属性值触发的 Trigger 最基本的触发器,Property 是关注的属性名称,value 是触发条件,一旦触发条件满足,就会应用 Trigger 的 Setters ...

  6. WPF触发器(Trigger) - DataTrigger

    官方文档中对DataTrigger的介绍 Represents a trigger that applies property values or performs actions when the ...

  7. WPF XAML Trigger中使用动画后 动画对象冻结的处理办法

    在编写XAML时 在Trigger中使用动画,在动画之后,动画对象就会被冻结,无法被其他动画或者属性改变. 处理办法有: 1 使用附加属性来添加动画 public static readonly De ...

  8. 【WPF】使用 XAML 的 Trigger 系统实现三态按钮

    利用 WPF 的 Trigger 系统,也可以很简单的只使用xmal实现三态按钮.在Window或UserControl的资源中声明按钮的style并加入触发功能.使用的时候直接在button里复写s ...

  9. Trigger和ViewStateManager的具体比较

    ViewStateManager的好处  拥有 GeneratedDuration ,可以很方便的进行几个状态之间的切换过渡动画. 坏处是,在界面加载时只能显示默认效果,通过GoToStateActi ...

随机推荐

  1. 【u032】均衡发展

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 神牛小R在许多方面都有着很强的能力,具体的说,他总共有m种能力,并将这些能力编号为1到m.他的能力是一 ...

  2. 【t055】成绩统计

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 华南师大附中月考二已经结束,级长想知道最高分是谁.但是现在级长很忙,没有时间统计成绩,于是他找到了你, ...

  3. Vert.x ——概述

    Vert.x是什么 Vert.x(http://vertx.io/)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. Vert.x框架基于事件和异步,依托 ...

  4. [NPM] Make npm scripts cross-environment friendly

    Unfortunately not all shell commands work across various environments. Two main techniques to suppor ...

  5. [javase学习笔记]-6.5 类类型參数与匿名对象

    这一节我们来说说类类型參数和匿名对象. 我们继续用之前的小汽车类吧 class Car { int num;//这是轮胎数属性 String color;//这是颜色属性 String brand;/ ...

  6. tip of Firefox extention foxyproxy

    tip of Firefox extention foxyproxy

  7. KVC设置系统自带属性,不管是不是私有的属性

    KVC   可以设置系统自带属性,不管是不是私有的属性:    1,   2,  

  8. 【烽火传递】dp + 单调队列优化

    题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火台发出信 ...

  9. 云主机启动Node服务后,关闭控制台,无法访问的问题

    之前一直用node app.js操作,开启服务后,关闭控制台,仍然可以正常访问我的网站.但昨晚新买腾讯云的服务器后,发现关闭控制台后,就无法访问网站了.然后给腾讯云发了个工单.腾讯云的工程师给了一篇技 ...

  10. GridLayout网格布局

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...