代码说明:我要实现一个这样的功能  有三个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. Apache+PHP 环境上传文件配置

    打开php.ini 配置文件,查找 File Uploads ,在这个区域有以下3个选项: file_uploads = On 是否允许HTTP文件上传.默认值为On允许HTTP文件上传,此选项不能设 ...

  2. 出现 HTTP Error 503. The service is unavailable 错误

    今天修改一些配置后重启了IIS,兴高采烈的按下了回车.duang一下,HTTP Error 503. The service is unavailable,蹦出这行字,网站挂了. 没动别的竟然这样了. ...

  3. OpenStack G版以后的Availability Zone与Aggregate Hosts

    关于Availability Zone与Aggregate Hosts的概念解析,可以参考这篇文章:http://blog.chinaunix.net/uid-20940095-id-3875022. ...

  4. 代码编写横屏的UIView

    - (id )initWithFrame:(CGRect )frame { if (self = [super initWithFrame :frame]) { // Important here, ...

  5. MySQL表设计基础

    MySQL表设计关于blog数据库中建立所有表的sql语句<一.>sql语句中 约束概念constraint concept1.1 实体完整性entity integrity(主键--唯一 ...

  6. MySQL注入总结

    SELECT first_name, last_name FROM users WHERE user_id = '$id' 1.id=1' or 1=1 --     这个可以查询所有的信息,其中“- ...

  7. Nunit中文文档

    NUnit中文文档:http://www.36sign.com/nunit 关于特性的使用:http://www.36sign.com/nunit/attributes.html

  8. enum类型被intent所携带时需要注意的地方

    一般我们在Activity之间传递对象时多用Parcelable.比如写一个class,在这个class上标明implements Parcelable并实现接口就可以用Intent.putExtra ...

  9. Optimized Pagination using MySQL---reference

    Dealing with large data sets makes it necessary to pick out only the newest or the hottest elements ...

  10. Visual Studio 调试技巧 -- 为 Lambda 表达式设置中断

    如果我说 .NET 世界上最厉害的开发平台(语言),资深的同仁肯定不会往下看了,因为这将是一个无休止的争论,到头来搞不好还是人身攻击.然而,如果我说 Visual Studio 是世界上最友好最强大的 ...