wpf样式绑定 行为绑定 事件关联 路由事件实例
代码说明:我要实现一个这样的功能 有三个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样式绑定 行为绑定 事件关联 路由事件实例的更多相关文章
- 【WPF学习】第十三章 理解路由事件
每个.NET开发人员都熟悉“事件”的思想——当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息.WPF通过事件路由(event routing)的概念增强了.NET事件模型.事件路由 ...
- WP8.1学习系列(第十九章)——事件和路由事件概述
我们将介绍在使用 C#.Visual Basic 或 Visual C++ 组件扩展 (C++/CX) 作为编程语言并使用 XAML 进行 UI 定义时,针对 Windows 运行时应用的事件的编程概 ...
- CLR事件与路由事件在XAML代码中应用时的区别
<Window x:Class="Demo_window.Window2"xmlns="http://schemas.microsoft.com/winfx/200 ...
- WPF 之路由事件和附加事件(六)
一.消息驱动与直接事件模型 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...
- 【WPF】路由事件
总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...
- WPF 路由事件 Event Routing
原文:WPF 路由事件 Event Routing 1.路由事件介绍 之前介绍了WPF的新的依赖属性系统,本篇将介绍更高级的路由事件,替换了之前的.net普通事件.相比.net的事件,路由事件具有更强 ...
- WPF MVVM模式下路由事件
一,路由事件下三种路由策略: 1 冒泡:由事件源向上传递一直到根元素.2直接:只有事件源才有机会响应事件.3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源.一般情况下,WPF提供的输入事 ...
- WPF的路由事件、冒泡事件、隧道事件(预览事件)
本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...
- WPF 自定义路由事件
如何:创建自定义路由事件 首先自定义事件支持事件路由,需要使用 RegisterRoutedEvent 方法注册 RoutedEvent C#语法 public static RoutedEvent ...
随机推荐
- UVA 465 (13.08.02)
Overflow Write a program that reads an expression consisting of twonon-negative integer and an ope ...
- svn操作
1.已经被svn管理的文件的复制.删除.重命名都要通过svn的命令来操作(在资源管理器中通过鼠标右键来完成)(复制粘贴可以通过右键按下移动来实现) 2.没有被svn管理的文件(没有被上传过的文件,没有 ...
- Java 23种设计模式详尽分析与实例解析之一--创建型模式
面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...
- 搜狗输入法皮肤安装 分类: windows常用小技巧 2014-05-04 15:10 172人阅读 评论(0) 收藏
第一步: 下载皮肤,皮肤是.ssf格式的. 第二步: 找到安装目录:(以我的为例) D:\软件\搜狗输入法\SogouInput\7.1.0.1652\AllSkin: 把下载的皮肤剪切(或复制)到此 ...
- jsp页面写入中文到mysql时出现了乱码(转)
今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...
- SQL语法集锦一:SQL语句实现表的横向聚合
本文转载:http://www.cnblogs.com/lxblog/archive/2012/09/29/2708128.html 问题描述:假如有一表结构和数据如下: C1 C2 C3 C4 C5 ...
- WCF服务部署到IIS上,然后通过web服务引用方式出现错误的解决办法
本文转载:http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html 昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内 ...
- MFC——error LNK2005: "protected: static struct AFX_MSGMAP
好久没弄VC程序了,今天弄了下,还会用公司给的窗口重绘作为基类来实现,竟然报了这个错误. 找了一下是这里: 有个窗口重绘类是基类: class CBaseDlg : public CDialog 新建 ...
- MySQL Error Handling in Stored Procedures---转载
This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in store ...
- object C—类中函数的调用
Object C-类中函数的调用 创建,三个类.然后,在代码中调用相同名字的函数.观察他们的调用次序. @interface test : NSObject - (void)print; @end @ ...