代码说明:我要实现一个这样的功能  有三个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. svn操作

    1.已经被svn管理的文件的复制.删除.重命名都要通过svn的命令来操作(在资源管理器中通过鼠标右键来完成)(复制粘贴可以通过右键按下移动来实现) 2.没有被svn管理的文件(没有被上传过的文件,没有 ...

  2. poj 1328贪心

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  3. mysql创建数据库(指定编码)

    如下脚本创建数据库yourdbname,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 CO ...

  4. UIApplication对象及其代理UIApplicationDelegate[转]

    在开发过程中我们需要一些全局对象来将程序的各个部分连接起来,这些全局对象中最重要的就是UIApplication对象.但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理打交 ...

  5. [PWA] 19. Cache the avatars

    Cache the avatars is little different from cache photos. We need to serve the page with our cache da ...

  6. Instruction (hdu 5083)

    Instruction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. 关于 Cocoa Pods 的使用

    前提:电脑上已经安装好CocoaPods. 创建Podfile: 1.进入到项目的目录中: $ cd 目录 2.使用终端命令行: $ vim Podfile 3.然后按i键,进入编辑模式 我现在使用的 ...

  8. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  9. Python之路【第十一篇】:CSS --暂无内容-待更新

    Python之路[第十一篇]:CSS --暂无内容-待更新

  10. 关于在MDK4.5以上版本不能使用JLINK V8的解决办法

    如果安装MDK4.50版本以上不能使用jlink8的话,请安装jlink 4.36k版本(或以下)驱动,安装完成后,把\SEGGER\JLinkARM_V436k目录下的JLinkARM.dll拷贝到 ...