随笔分类 - WPF
1
摘要:基于以下的理由,ViewModel也是需要多个,并且需要被注入的:1:设计时和运行时需要为View提供不同的数据简单来说,就是设计时需要模拟数据。界面设计开发人员需要进行绑定(包括支持Expression Blend绑定)做一些简单的处理,同时因为提供了模拟数据,UI人员可以更好的设计实际的界面。2:为了方便单元测试在运行时,大部分情况下,ViewModel会组合进提供Service的业务类。在简单的应用中,我们可以注入Service类的MOCK来进行单元测试,如果是这样,就可以避免提供多个ViewModel。但在有些应用中,如Silverlight应用中,服务由WerbService、WCF
阅读全文
摘要:1:项目结构图2:控件SilverlightControl1前台:后台: public partial class SilverlightControl1 : UserControl { public SilverlightControl1() { InitializeComponent(); } public static readonly DependencyProperty StudentProperty = DependencyProperty.Register("Student", typeof(Student), typeof(SilverlightContro
阅读全文
摘要:在上一篇《使用MVVM模式开发自定义UserControl》中,有一个重要的补充内容,就是WPF中的EventTrigger和命令绑定,在本篇中继续阐述。如果单纯在Button中使用命令绑定,则其本身就带有Command属性,但是扩展到任何其它控件,就得稍微复杂一点。以本篇来讲,依赖于我们拥有如下两个dll:Microsoft.Expression.Interactions.dllSystem.Windows.Interactivity.dll这两个dll在装完毕expression blend后会出现在引入列表中。不过,即便我们没有装blend,也可以直接从其它地方COPY过来。在本例中,它
阅读全文
摘要:本篇讲述使用MVVM来开发用户控件。由于用户控件在大部分情况下不涉及到数据的持久化,所以如果将M纯粹理解为DomainModel的话,使用MVVM模式来进行自定义控件开发实际上可以省略掉M,变成了VVM。一:基本结构本演示样例包含两个项目,WpfControls是用户控件项目,我们的用户控件全部包含在这里。项目WpfApplication1是Wpf窗体项目,为调用方。我们的第一步的整体解决方案结构如下所示:二:第一阶段源码建立UserControl1,要求能够对输入属性StudentName和Age,做出反应,即呈现在UI上。首先创建ViewModel,即StudentViewModel: p
阅读全文
摘要:前台:<UserControl x:Name="msl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.o
阅读全文
摘要:WPF快速指导15:动画在WPF或者SilverLight中,所谓动画,就是让一个对象的属性,随着时间而发生变化。动画由时间线(timeline)控制。时间线在C#中的原型为: public abstract class Timeline : Animatable { //省略 }它是一个抽象类。在WPF中,定义了各类时间线,最常用的有DoubleAnimation,它便继承自Timeline。1:Storyboard及一个简单示例容纳时间线的是故事板(Storyboard)。下面是一个最简单的例子:前台: <Canvas x:Name="Carrier" Width
阅读全文
摘要:WPF快速指导14:变换变换,也叫变形(transform)。它定义了从一个坐标空间到另一个坐标空间的映射。变换通过矩阵来描述。变换包括旋转、伸缩、倾斜、调动,这些行为都是矩阵变换。用户还可以实现自己的矩阵。各种变换通过RenderTransform属性来应用。RenderTransform是UIElement的一个公共属性,它的类型是Transform。类型Transform是一个抽象类。所以,要为元素的设置变化,就意味着要为元素的RenderTransform属性设置一个Transform的子类的一个实例对象。这话听上去有些拗口,但是下面的示例可以让大家明确这一点。1:变换之RotateT
阅读全文
摘要:WPF快速指导13:数据绑定之集合绑定之视图(排序、过滤、分组) 本文摘要:1:为什么需要视图; 2:变更集合; 3:排序; 4:过滤筛选; 5:分组; 1:为什么需要视图 一旦 ItemsControl 绑定到数据集合,您可能希望对数据进行排序、筛选或分组。若要执行此操作,可以使用集合视图,这是实现 ICollectionView 接口的类。 集合视图是位于绑定源集合顶部的一层,您可以通过它使用排序、筛选和分组查询来导航和显示源集合,而无需更改基础源集合本身。集合视图还维护着一个指向集合中的当前项的指针。如果源集合实现了 INotifyCollectionChanged 接口,则
阅读全文
摘要:WPF快速指导12: 线程处理模型 本文摘要: 1:理解与UI相关的多线程操作; 2:多个窗口多个线程 3:WPF中的多线程异常1:理解与UI相关的多线程操作 首先来说说传统Winform。我们知道传统Winform新起工作线程,在工作线程中不能对界面元素进行操作。如下面的代码,运行会报错“线程间操作无效: 从不是创建控件“label1”的线程访问它。”: 要使上面的代码能成功运行,我们需要使用控件的Invoke 和 BeginInvoke和方法。这两个方法的意思是说,让赋值这个行为交给UI线程去处理。代码如下: 而WPF的控件,我们找不到Invoke 和 BeginInvoke这两个方法
阅读全文
摘要:WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别 本文摘要: 1:什么是路由事件; 2:中断事件路由; 3:自定义路由事件; 4:为什么需要自定义路由事件; 5:什么是冒泡事件和预览事件(隧道事件);1:什么是路由事件 WPF中的事件为路由事件,所谓路由事件,MSDN定义如下: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理
阅读全文
摘要:WPF快速指导6:触发器 本文摘要: 1:属性触发器; 2:数据触发器; 3:事件触发器; Style、ControlTemplate 和 DataTemplate 都有触发器集合。 属性触发器只检查WPF从属属性,而数据触发器则可检查任何一种可绑定的属性。属性触发器一般用来检查WPF可视元素的属性,而数据触发器则通常用来检查不可视对象的属性。 属性触发器:通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。 数据触发器:通过此机制,事件会在属性中触发动态更改。 数据触发器:EventTrigger,它根据事件的引发来启动一组操作,但这类操作仅限于动画。 一:属性触发器 查看代码片
阅读全文
摘要:WPF快速指导5:验证 本文摘要: 1:WPF中的验证处理机制; 2:自定义验证规则; 3:如何显示验证错误信息 4:指定何时进行验证 1:WPF中的验证处理机制 接受用户输入的大多数应用程序都需要具有验证逻辑,以确保用户输入了需要的信息。验证检查可以基于类型、范围、格式或其他应用程序特定的要求。本节讨论了数据验证在 WPF 中的工作方式。 先来看一个简单的例子 后台: WPF中的验证处理机制是:当验证结果出现非法数据时,就会产生一个包含错误信息的ValidationError对象供界面进行显示。在使用了ExceptionValidationRule的情况下,这个错误对象会包含验证规则所
阅读全文
摘要:WPF快速指导4:数据绑定之绑定方向与自定义转换器 本文摘要: 1:绑定目标与绑定源之间的方向; 2:自定义转换器; 1:绑定目标与绑定源之间的方向 该部分的定义MSDN已经描述的非常清楚了,如下: 您可能希望应用程序使用户可以更改数据并将数据传播回源对象。或者,您可能不希望允许用户更新源数据。您可以通过设置 Binding 对象的 Mode 属性来对此进行控制。下图演示不同类型的数据流: On...
阅读全文
摘要:WPF快速指导3:数据绑定 本文摘要:1:实体类的绑定;2:实体类集合的绑定及DataTemplate;3:自定义的实体类集合,如ObservableDictionary; 4:Path的语法; 1:实体类的绑定 理解WPF数据绑定,首先需要理解接口INotifyCollectionChanged。 场景1:UI显示学生信息,当学生姓名发生改变的时候,就需要实时地表现到UI上。在这种情况下,就需要Student这个类实现INotifyCollectionChanged接口。如下: 可以看到,实体类Student需要实现的INotifyPropertyChanged 接口成员为:public
阅读全文
摘要:WPF快速指导2:模板 本文摘要: 1:模板作用; 2:样式模板; 3:数据模板; 4:如何使用ControlTemplate; 5:如何使用DataTemplate; 一:模板作用 1:样式模板,在应用程序内部维护和共享外观; 2:数据模板,实现表现形式和逻辑的分离; 二:样式模板 如: 片段1: 三:数据模板 数据模板的作用就是实现表现形式和逻辑的分离。 查看如下的代码片段, 片段3: 这...
阅读全文
摘要:WPF快速指导1:资源 本文摘要: 1:资源应用场景; 2:静态资源和动态资源; 3:Application.Current.Resources和Application.Current.Resources.MergedDictionaries 4:路径一:资源的应用场景场景1:格式化界面显示元素 所谓格式化界面显示元素,就是使用统一的风格来定义软件的每个界面。 要满足本需求,只需要在App.xaml中如下定义资源 同时,在每个页面如下引用资源即可: 场景2:动态更新界面风格 要动态更新界面风格,首先需要定义多种界面风格。假设有Sytle1和Style2两种风格,其中Style1在Style1
阅读全文
摘要:WPF快速指导7:控件和自定义控件本文摘要:1:控件和自定义控件的概念;2:更改控件的外观;3:自定义控件的设计原则;1:控件和自定义控件的概念 Windows Presentation Foundation (WPF) 附带了许多几乎在所有 Windows 应用程序中都会使用的常见 UI 组件,如 Button、Label、TextBox、Menu 和 ListBox。以前,这些对象被称为控件。现在,WPF SDK 继续使用术语“控件”泛指任何代表应用程序中可见对象的类。请注意,类不必从 Control 类继承即可具有可见外观。从 Control 类继承的类包含一个 ControlTempl
阅读全文
摘要:WPF快速指导11:输入和命令本文摘要:1:输入的种类;2:命令1:输入的种类 可在基元素类上找到公开的主输入 API:UIElement、ContentElement、FrameworkElement 和 FrameworkContentElement。除了基元素类上的输入 API,Keyboard 类和 Mouse 类还提供了用于处理键盘和鼠标输入的其他 API。 Keyboard 类上的输入 API 的示例有 Modifiers 属性(用于返回当前按下的 ModifierKeys)和 IsKeyDown 方法(用于确定是否按下了指定的键)。 下面的示例使用 GetKeyStates 方法
阅读全文
摘要:WPF快速指导9:WPF中的属性(依赖项属性)本文摘要:1:什么是依赖项属性;2:实现依赖项属性;1:什么是依赖项属性 Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。 依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。这些其他输入可以包括系统属性(如主题和用户首选项)、实时属性确定机制(如数据绑定和动画/演示图板)、重用模板(如资源和样式)或者通过与元素树中其他元素的父子关系来公开的值。另外,可以
阅读全文
摘要:WPF快速指导8:WPF基元素类本文摘要:1:什么是基元素类;2:基元素类的使用;3:其它重要基类1:什么是基元素类 WPF中的大部分类都是从 SDK 文档中通常称为基元素类的四个类派生而来。这些类包括 UIElement、FrameworkElement、ContentElement 和 FrameworkContentElement。DependencyObject 也相关,因为它是 UIElement 和 ContentElement 的公共基类。 UIElement 用作 FrameworkElement 的基类,ContentElement 用作 FrameworkContentEl
阅读全文
1