代码说明:我要实现一个这样的功能  有三个window窗口  每个窗体有一个label标签  当我修改三个label标签中任意一个字体颜色的时候  其他的label标签字体颜色也变化

首先三个窗体不用贴代码了  直接添加三个就行了

样式绑定:

先添加数据源  代码如下: (注:为了防止propertyName硬编码写死   可以使用CallerMemberName附加属性来获取默认的属性名称 或者使用表达式目录树Expression<Func<T>>的方式来获取)

 public class ButtonBase : ContentControl, INotifyPropertyChanged
{
public static readonly RoutedEvent ClickEvent;
private SolidColorBrush brush = new SolidColorBrush(Colors.Red); public event PropertyChangedEventHandler PropertyChanged; private static ButtonBase btnBase; public static ButtonBase getButtonBase()
{
if (btnBase == null)
btnBase = new ButtonBase() { Foreground = new SolidColorBrush(Colors.Red) };
return btnBase;
}
public SolidColorBrush Brush
{
get { return brush; }
set
{
if (value != brush)
{
brush = value;
NotifyPropertyChanged<SolidColorBrush>(() => this.Brush);//NotifyPropertyChanged();
}
}
}
private void NotifyPropertyChanged([CallerMemberName] String PropertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
private void NotifyPropertyChanged<T>(Expression<Func<T>> PropertyName)
{
if (PropertyChanged != null)
{
var expressions = PropertyName.Body as MemberExpression; PropertyChanged(this, new PropertyChangedEventArgs(expressions.Member.Name));
}
}

给Label标签绑定数据源  窗体初始化的时候绑定三遍就可以了  绑定完以后  直接设置就行了

            Binding bind = new Binding();
bind.Source = ButtonBase.getButtonBase();
bind.Mode = BindingMode.TwoWay;
bind.Path = new PropertyPath("Brush");
label1.SetBinding(Label.ForegroundProperty, bind);

行为绑定

先添加引用 C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.5\Libraries\System.Windows.Interactivity.dll
using System.Windows.Interactivity;

定义一个UIElement拖动的行为

 public class DragInCanvasBehavior : Behavior<UIElement>
{
private Canvas canvas;
private bool isDragOn = false;
private Point mouseOffset;
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
}
void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
{
if (isDragOn)
{
Point point = e.GetPosition(canvas);
AssociatedObject.SetValue(Canvas.LeftProperty,point.X);
AssociatedObject.SetValue(Canvas.TopProperty,point.Y);
}
} void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (isDragOn)
{
AssociatedObject.ReleaseMouseCapture();
isDragOn = false;
}
} void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (canvas == null)
canvas = (Canvas)VisualTreeHelper.GetParent(this.AssociatedObject);
isDragOn = true;
mouseOffset = e.GetPosition(AssociatedObject);
AssociatedObject.CaptureMouse();
} }

前台使用该行为

  xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

 <Canvas HorizontalAlignment="Left" Height="" VerticalAlignment="Top" Width="" Margin="10,138,0,0" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleY="0.583"/>
<RotateTransform/>
<TranslateTransform Y="0.565"/>
</TransformGroup>
</Canvas.RenderTransform>
<Rectangle x:Name="dragRec" Canvas.Left="" Canvas.Right="" Fill="Red" Width="" Height="">
<i:Interaction.Behaviors>
<loc:DragInCanvasBehavior></loc:DragInCanvasBehavior>
</i:Interaction.Behaviors>
</Rectangle>
<Label Content="abcdefg">
<i:Interaction.Behaviors>
<loc:DragInCanvasBehavior></loc:DragInCanvasBehavior>
</i:Interaction.Behaviors>
</Label>
</Canvas>

事件关联   当鼠标放到button上面的时候字体变大  button背景颜色变化

 <Style x:Key="buttonStyle">
<EventSetter Event="Button.MouseEnter" Handler="button_MouseEnter"></EventSetter>
<EventSetter Event="Button.MouseLeave" Handler="button_MouseLeave"></EventSetter>
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="FontSize" To="">
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.1" Storyboard.TargetProperty="FontSize">
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>

App.xmal.cs 后台代码

  private void button_MouseEnter(object sender, MouseEventArgs e)
{
(sender as Button).Background = new SolidColorBrush(Colors.Brown);
}
private void button_MouseLeave(object sender, MouseEventArgs e)
{
(sender as Button).Background = null;
}

wpf样式绑定 行为绑定 事件关联 路由事件实例的更多相关文章

  1. 【WPF学习】第十三章 理解路由事件

    每个.NET开发人员都熟悉“事件”的思想——当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息.WPF通过事件路由(event routing)的概念增强了.NET事件模型.事件路由 ...

  2. WP8.1学习系列(第十九章)——事件和路由事件概述

    我们将介绍在使用 C#.Visual Basic 或 Visual C++ 组件扩展 (C++/CX) 作为编程语言并使用 XAML 进行 UI 定义时,针对 Windows 运行时应用的事件的编程概 ...

  3. CLR事件与路由事件在XAML代码中应用时的区别

    <Window x:Class="Demo_window.Window2"xmlns="http://schemas.microsoft.com/winfx/200 ...

  4. WPF 之路由事件和附加事件(六)

    一.消息驱动与直接事件模型 ​ 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...

  5. 【WPF】路由事件

    总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...

  6. WPF 路由事件 Event Routing

    原文:WPF 路由事件 Event Routing 1.路由事件介绍 之前介绍了WPF的新的依赖属性系统,本篇将介绍更高级的路由事件,替换了之前的.net普通事件.相比.net的事件,路由事件具有更强 ...

  7. WPF MVVM模式下路由事件

    一,路由事件下三种路由策略: 1 冒泡:由事件源向上传递一直到根元素.2直接:只有事件源才有机会响应事件.3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源.一般情况下,WPF提供的输入事 ...

  8. WPF的路由事件、冒泡事件、隧道事件(预览事件)

    本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...

  9. WPF 自定义路由事件

    如何:创建自定义路由事件 首先自定义事件支持事件路由,需要使用 RegisterRoutedEvent 方法注册 RoutedEvent C#语法 public static RoutedEvent ...

随机推荐

  1. CSU 1511 残缺的棋盘 第十届湖南省赛题

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 题目大意:在一个8*8的棋盘中,给你一个起点位置和一个终点位置,同时也给你一个陷阱 ...

  2. redis ins 调试

    Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...

  3. CSS3 新增属性

    1Css3概述 从2010年开始,HTML5与CSS3就一直是互联网技术中最受关注的两个话题. 从前端技术的角度可以把互联网的发展分为三个阶段:第一阶段是web1.0以内容为主的网络 前端主流技术是H ...

  4. UVaLive4043 UVa1411 Ants 巨人与鬼

    题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...

  5. 未能导入activex控件,请确保它正确注册

    这个错误"未能导入activex控件,请确保它正确注册"昨天下午让我和我同事花费了3个小时来调试这个错误,在使用VS2010的winfrom编程时加入com组件的时候,报这个错误( ...

  6. 【protobuf进阶】通过.proto文件导出C#支持的.cs类文件

    protobuf是一个跨平台的消息交互协议,类似xml.json等. protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多 ...

  7. Bluetooth 4.0之Android 解说

     Android平台包括了对蓝牙网络协议栈的支持,它同意一个蓝牙设备跟其它的蓝牙设备进行无线的数据交换.应用程序通过Android蓝牙API提供訪问蓝牙的功能. 这些API会把应用程序无线连接到其 ...

  8. 回收InnoDB表空间

    以下论述均假定innodb_file_per_table开启 先用常规optimize回收: mysql> select count(*) from t; +----------+ | coun ...

  9. 树莓派入手(烧写系统,调整分区,配置Java环境,串口GPS配置) 分类: Raspberry Pi 2015-04-09 21:13 145人阅读 评论(0) 收藏

    原来的tf卡无故启动不起来,检查发现其文件系统分区使用率为0%. 数据全部丢失!!!!! 血的教训告诉我们备份文件系统的重要性,一切需要重头来.... 烧录系统 安装系统有两种方式, NOOBS工具安 ...

  10. [每日一题] 11gOCP 1z0-052 :2013-09-1 RMAN-- repair failure........................................A20

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/10859315 正确答案:D 一.模拟上题的错误: 1.删除4号文件 [oracle@myd ...