代码改变世界

随笔分类 - WPF

使用 MVVMLight 消息通知

2014-07-16 16:01 by Andrew.Wangxu, 1800 阅读, 收藏, 编辑
摘要:在文章的其实我们就说了,MVVMLight的精华就是消息通知机制,设计的非常不错。这个东西在MVVMLight可以说是用的及其的频繁,当 ViewModel请求View要有些改变的时候(比如弹个窗体)那么你在ViewModel里面编写弹窗的代码?那也就违背了MVVM的设计模式 啦,MVVMLight的消息通知可以实现互相调用代码而不耦合! 阅读全文

使用 MVVMLight 命令绑定

2014-07-14 10:53 by Andrew.Wangxu, 225 阅读, 收藏, 编辑
摘要:首先,如果您希望了解更多的MVVMLight技术或希望有顺序的学习MVVMLight,请查阅目录《MVVMLight 设计模式系列使用文章》。 继上一篇文章的项目,我们实现了数据绑定到界面中。这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用。 首先我们要实现的目标是,在界面中可以点击按钮添加数据,但是最多能添加5条数据,最少保证有1条数据。也就是两个按钮哈(增加数据/删除数据)。界面如下: 阅读全文

使用 MVVMLight 绑定数据

2014-07-14 10:52 by Andrew.Wangxu, 885 阅读, 收藏, 编辑
摘要:如果你还不知道如何在VS中加入MVVMLight的引用,那么建议你先翻阅这篇文章:在VS中安装/使用 MVVMLight 这篇文章主要是介绍如何使用MVVMLight来绑定数据到界面中(View),以此来了解MVVMLight的一些基础的类的用法。 文章底部会提供本示例的源码下载。 阅读全文

在VS中安装/使用 MVVMLight

2014-07-14 10:51 by Andrew.Wangxu, 696 阅读, 收藏, 编辑
摘要:一般来说,我喜欢使用NuGet来获取这些东西,比如Newtonsoft.Json、netlog4、MVVMLight 之类的东西。至于NuGet的使用,以后再说吧。为了直接进入正题,我们这里直接使用VS中的“扩展和更新”来安装MVVMLight组件。 我使用的是VS2013,其他版本的操作也基本上一样。接下来我们将安装MVVMLight到VS中。 安装 MVVMLight Toolkit 为什么说是 MVVMLight Toolkit ?实际上我们一般安装的都是 MVVMLight Toolkit ,这个里面包含了工具就是在VS新建工程的时候你会看见有MVVMLight的模板(而使用 NuGet 来直接引用MVVMLight 则没有这些模板之类的东西,比较干净。),其实两个都是同一个东西,只是一个有工程模板,另一个则是仅仅对MVVMLight相关文件的引用。 阅读全文

关于 MVVMLight 设计模式系列

2014-07-14 10:49 by Andrew.Wangxu, 488 阅读, 收藏, 编辑
摘要:MVVM设计模式你可以在WPF、Silverlight、Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight 。 本系列文章以WPF举例,似乎在百度上如果你要查找MVVM相关的某个知识点,难点,给我的感觉资料是比较少的。本篇文章是一个目录导航,我会在最 近一段时间把相关的MVVMLight的知识与技巧发布在我的博客中,并在本文中以目录的方式呈现。希望能为业界贡献一份微薄之力,帮助到正在看此文的 你。 有不足之处还望各位Coder们指导纠正,同时欢迎补充 or 投稿MVVMlight系列的文章。 阅读全文

DoBox 下载

2014-01-22 09:53 by Andrew.Wangxu, 200 阅读, 收藏, 编辑
摘要:一款简单十分好用的办公助手,用于记录您接下来需要做的事情。待办事项小工具 - DoBox 阅读全文

List 和 ObservableCollection的区别

2013-12-02 13:54 by Andrew.Wangxu, 588 阅读, 收藏, 编辑
摘要:在WPF中绑定一个集合的时候,比如:DataGrid.ItemsSource = new List(); 这样的操作,会存在当数据行新增或者删除的时候不会得到及时的通知来刷新界面,而需要重新绑定DataGrid.ItemsSource = null; 再次重新绑定来实现。这样的工作效率比较低,另外使用起来也比较麻烦(在MVVM设计模式中)比较明显。 阅读全文

WPF 跟踪命令和撤销命令(复原)

2013-09-21 19:10 by Andrew.Wangxu, 1108 阅读, 收藏, 编辑
摘要:WPF 命令模型缺少一个特性是复原命令。尽管提供了一个 ApplicationCommands.Undo 命令,但是该命令通常被用于编辑控件(如 TextBox 控件),以维护它们自己的 Undo 历史。如果希望支持应用程序范围内的 Undo 特性,就需要在内部跟踪以前的状态,并且触发 Undo 命令时还原该状态。 遗憾的是,扩展 WPF 命令系统并不容易。相对来说没有几个入口点可以使用连接自定义逻辑。为了创建通用、可重用的 Undo 特性,需要创建一组全新的“能够撤销命令的”命令类,以及一个特定类型的命令绑定。我们需要设计自己的用于跟踪和复原命令的系统,使用 CommandManager 类保存命令历史。下图显示了本文的例子。在该例子中,窗口包含两个文本框和一个列表框,可以自由地在这两个文本框中输入内容,而列表框则一直跟踪在这两个文本框中发生的所有命令。可以通过单击 ‘复原’ 按钮还原最后一个命令。 阅读全文

WPF 自定义命令 以及 命令的启用与禁用

2013-09-21 13:48 by Andrew.Wangxu, 1210 阅读, 收藏, 编辑
摘要:自定义命令: 在WPF中有5个命令类(ApplicationCommands、NavigationCommands、EditingCommands、ComponentCommands 以及 MediaCommands)中存储命令,显然不会为应用程序提供所有可能需要的命令,幸运的是,定义自己的命令非常容易。需要的全部工作仅仅是实例化一个新的 RoutedUICommand 对象 即可。 RoutedUICommand 类提供了几个构造函数。虽然可以创建没有任何附加信息的RoutedUICommand对象,但几乎总是希望提供命令名称、命令文本以及属性类型。此外,可能希望为 InputGestures 集合提供快捷键。 阅读全文

WPF 本地化(多语言)

2013-09-19 14:07 by Andrew.Wangxu, 1646 阅读, 收藏, 编辑
摘要:如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些WPF设计原则: 不要使用硬编码的宽度或高度 将Window.SizeToContent 属性设置为Width、Height 或 WidthAndHeight,从而使窗口的尺寸能够根据需要进行变化(根据窗口结构的不同,并不总需要这样,但有时候会很有用)。 使用 ScrollViewer 控件包装大量的文本 阅读全文

List<T>与ObservableCollectio<T> 的区别

2013-09-17 22:12 by Andrew.Wangxu, 139 阅读, 收藏, 编辑
摘要:在WPF中绑定通常会使用ObservableCollection,为什么不使用List呢? 简单是解释:List不包含值变通知功能,所以绑定了也许会出现绑定的数据与呈现数据不一致的问题。 通常绑定会使用 ObservableCollection。 因为 List没实现 INotifyCollectionChanged ,所以它只是一个普通的容器。~ 阅读全文

WPF 单实例应用程序

2013-09-17 22:08 by Andrew.Wangxu, 666 阅读, 收藏, 编辑
摘要:例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例。 这便是单实例应用程序。 对于这种单实例应用程序,WPF 本身并未提供解决方法,但是可以使用几种变通的方法。基本的技术是当触发 Application.StartUp 事件时,检查另一个应用程序是否正在运行。最简单的方法是使用一个全局的 mutex 对象(mutex对象是操作系统提供的一个用于进程之间通信的同步对象)。这种方法很简单但是功能有限——最重要的是,应用程序新实例无法和已经存在的实例进行通信。 因为当你打开文件的时候,比如*.doc 你需要将该文件的一些基本信息传递到已打开的实例中才行。 当然,你还可以使用 remoting、WCF 进行通信。那还得开发服务端,也使其变得复杂。 阅读全文

WPF Expander控件(扩展面板)

2013-09-14 16:28 by Andrew.Wangxu, 2635 阅读, 收藏, 编辑
摘要:这算是我比较喜欢的一个控件,以前在Winform中也常用类似的。它包装了一块内容,通过单击一个小箭头按钮可以显示或隐藏所包含的内容。在线帮助以及Web页面经常使用这种技术,因为既可以包含大量内容,而又不会让用户面对大量的多余信息而感到无所适从。 使用 Expander控件是非常简单的——只需要在该控件内部包装希望使其能够折叠的内容,通常,每个 Expander 控件开始都是折叠的,但是可以在代码或标记中设置 IsExpanded 属性来改变这种行为。控件的折叠是非常有趣,展开于叠起自动排版,这是我非常喜欢的。 阅读全文

WPF 的拖拽操作(DragDrop)

2013-09-14 14:02 by Andrew.Wangxu, 651 阅读, 收藏, 编辑
摘要:在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样。如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化。重要的区别是用于拖放操作的方法和事件被集中到了 System.Windows.DragDrop 类中,然后供其他类(如 UIElement )使用。 本质上,拖放操作通过以下三个步骤进行: 用户单击一个元素或选择一个元素特定的区域,并保持鼠标为按下状态。这时,某些信息被搁置起来,并且拖放操作开始。 用户将鼠标移动到其他元素上。如果该元素可以接受正在拖动的内容类型,鼠标指针会变成拖放图标。否则鼠标指针会变成一个内部有一条线的圆形,表示不可拖入该数据。 当用户释放鼠标时,元素接收信息并作出决定如何处理接收到的信息。 阅读全文

WPF 隧道路由事件

2013-09-10 21:10 by Andrew.Wangxu, 246 阅读, 收藏, 编辑
摘要:隧道路由事件的工作方式和冒泡路由事件相同,但方向相反。例如,如果 MouseUp 事件是一个隧道路由事件(实际上不是),在特殊的标签示例中单击图形将导致MouseUp 事件首先在窗口中引发、然后是在Grid 控件、接下来在 StackPanel 控件中引发,以此类推,直到到达实际源头,既标签中的图像为止。 很容易识别隧道路由事件,因为它们都以单词 Preview 开头。而且,WPF 通常成对地定义冒泡路由事件和隧道路由事件。这意味着如果发现一个冒泡的 MouseUp 事件,就还可以找到一个 PreviewMouseUp 事件。隧道路由事件总是在冒泡路由事件之前被触发的! 更有趣的是,如果将隧道路由事件标记为已处理过,那么冒泡路由事件就不会发生。这是因为两个事件共享同一个 RoutedEventArgs 类的实例。所以在操作的时候 一定要谨慎。 阅读全文

WPF 附加事件

2013-09-10 20:51 by Andrew.Wangxu, 614 阅读, 收藏, 编辑
摘要:在WPF中有许多控件有他们自己的特殊的事件。按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。 这回导致两难的境地。假设在 StackPanel 面板中包装了一堆按钮,并且希望在一个事件处理程序中处理所有这些按钮的单击事件。粗略的方法是将每个按钮 Click 事件都注册到同一个事件处理方法中。但是 Click 事件支持事件冒泡,从而提供了更好的一种选择。可以通过处理更高层次的元素的 Click 事件(如包含按钮的 StackPanel 面板)来处理所有的按钮单击事件。 这里会遇到一个问题,在StackPanel面板中并没有Click事件,正如上所说“按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。”,所以 XAML 解析器会解释成一个错误。解决方案是以“类名.事件名”的形式使用不同的关联事件语法。 阅读全文

WPF 冒泡路由事件

2013-09-08 11:52 by Andrew.Wangxu, 2110 阅读, 收藏, 编辑
摘要:在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容。甚至可以多此重复嵌套,直到达到您所希望的层次深度。 这种可以任意嵌套的能力也带来了一个有趣的问题。例如,假设有一个标签,它包含一个StackPanel面板,该面板又包含了两块文本图像: Image and text label Courtesy of the StackPanel 正如您已经知道的,放在WPF窗口中 阅读全文

WPF 纯代码生成界面(不使用XAML)

2013-09-07 19:46 by Andrew.Wangxu, 1212 阅读, 收藏, 编辑
摘要:对于编写 WPF 应用程序,只是用代码进行开发而不使用任何 XAML 不是常见的方式(但是仍然完全支持)。只使用代码进行开发的明显缺点是,有可能会使用编写 WPF 应用程序成为极端乏味的工作。 WPF 控件没有包含参数化的构造函数,因此即使为窗体添加一个简单的按钮也需要编写几行代码。只使用代码进行开发的一个潜在的优点是可以随意定制应用程序。例如,可以根据数据记录中的信息生成一个充满输入控件的窗体,或者可以根据当前的用户酌情添加或替换控件。需要的所有内容只不过是少量的条件逻辑。相比之下,如果使用XAML文档,它们只能作为固定不变的资源嵌入到程序集中。 阅读全文

XAML 中使用空格键(空白字符)

2013-09-07 18:27 by Andrew.Wangxu, 572 阅读, 收藏, 编辑
摘要:默认情况下,XAML折叠所有空白,这意味着包含空格、tab 键以及回车的长字符串将被转换为单个空格。而且,如果在一个元素内容之前或之后添加空白,这个空格将被完全忽略。 有时这并不是所期望的结果。例如,可能希望在按钮文本中包含一系列空格。在这种情况下,需要为元素使用 xml:space="preserve" 特性。 xml:space 特性是 XML 标准的一部分,并且是一个要么包含全部,要么什么都不包括的设置。一旦使用了设置,元素内的所有空白字符将被保留。如下标记: 阅读全文

WPF XAML 特殊字符(小于号、大于号、引号、&符号)

2013-09-07 18:14 by Andrew.Wangxu, 6887 阅读, 收藏, 编辑
摘要:XAML 受限于 XML 规则。例如, XML 特别关注一些特殊字符,如 & 如果试图使用这些字符设置一个元素内容,将会遇到许多麻烦,因为 XAML 解析器认为您正在做其他的事情——例如,创建一个嵌套元素。 例如,假设需要创建一个包含文本的按钮。下面的标记是不能完成这一工作的: 阅读全文

WPF InitializeComponent() 方法介绍

2013-09-07 17:15 by Andrew.Wangxu, 548 阅读, 收藏, 编辑
摘要:当编译应用程序时,定义用户界面的 XAML(如 Window1.xaml)被转换为 CLR 类型声明,这些类型声明和代码隐藏类文件(如 Window1.xaml.cs)中逻辑代码融合到一起,形成单一的单元。 现在,Window1 类尚不具备有任何真正的功能。然而,它却包含了一个非常重要的细节 ——默认构造函数,当创建类的一个实例时,该构造函数调用 InitializeComponent() 方法。该方法在 WPF 应用程序中扮演着一个重要角色。因此,永远不要删除在窗口构造函数中的 InitializeComponent() 调用。同样,如果为窗口类添加另一个构造函数,也要确保调用 InitializeComponent() 方法。 阅读全文

WPF 渲染级别 (Tier)

2013-09-07 16:18 by Andrew.Wangxu, 1270 阅读, 收藏, 编辑
摘要:在WPF中,显卡的功能相差很大。当WPF评估显卡时,它会考虑许多因素,包括显卡上的RAM数量、对像素着色器(piexl shader)的支持(计算每个像素效果的内置程序,如透明效果),以及对顶点着色器(vertex shader)的支持(计算三角形顶点数值的内置程序,如3D对象的着色)。根据这些细节,WPF会指定渲染级别值。 WPF 能够识别三个渲染级别,如下所示: 1. Rendering Tier0: 显卡不提供任何硬件加速功能。该级别和 7.0 或更低版本的DirectX 对应。 2. Rendering Tier1:显卡可以提供部分硬件加速功能。该级别和 7.0以上9.0以下 版本的DirectX相对应。 3. Rendering Tier2:所有特性将由硬件加速。该级别和 DirectX 9.0 及以上版本相对应。 阅读全文