摘要:
由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。的错误解决 阅读全文
随笔档案-2013年09月
WPF 跟踪命令和撤销命令(复原)
2013-09-21 19:10 by Andrew.Wangxu, 2887 阅读, 收藏, 编辑
摘要:
WPF 命令模型缺少一个特性是复原命令。尽管提供了一个 ApplicationCommands.Undo 命令,但是该命令通常被用于编辑控件(如 TextBox 控件),以维护它们自己的 Undo 历史。如果希望支持应用程序范围内的 Undo 特性,就需要在内部跟踪以前的状态,并且触发 Undo 命令时还原该状态。
遗憾的是,扩展 WPF 命令系统并不容易。相对来说没有几个入口点可以使用连接自定义逻辑。为了创建通用、可重用的 Undo 特性,需要创建一组全新的“能够撤销命令的”命令类,以及一个特定类型的命令绑定。我们需要设计自己的用于跟踪和复原命令的系统,使用 CommandManager 类保存命令历史。下图显示了本文的例子。在该例子中,窗口包含两个文本框和一个列表框,可以自由地在这两个文本框中输入内容,而列表框则一直跟踪在这两个文本框中发生的所有命令。可以通过单击 ‘复原’ 按钮还原最后一个命令。 阅读全文
WPF 自定义命令 以及 命令的启用与禁用
2013-09-21 13:48 by Andrew.Wangxu, 2056 阅读, 收藏, 编辑
摘要:
自定义命令:
在WPF中有5个命令类(ApplicationCommands、NavigationCommands、EditingCommands、ComponentCommands 以及 MediaCommands)中存储命令,显然不会为应用程序提供所有可能需要的命令,幸运的是,定义自己的命令非常容易。需要的全部工作仅仅是实例化一个新的 RoutedUICommand 对象 即可。
RoutedUICommand 类提供了几个构造函数。虽然可以创建没有任何附加信息的RoutedUICommand对象,但几乎总是希望提供命令名称、命令文本以及属性类型。此外,可能希望为 InputGestures 集合提供快捷键。 阅读全文
WPF 本地化(多语言)
2013-09-19 14:07 by Andrew.Wangxu, 2484 阅读, 收藏, 编辑
摘要:
如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些WPF设计原则:
不要使用硬编码的宽度或高度
将Window.SizeToContent 属性设置为Width、Height 或 WidthAndHeight,从而使窗口的尺寸能够根据需要进行变化(根据窗口结构的不同,并不总需要这样,但有时候会很有用)。
使用 ScrollViewer 控件包装大量的文本 阅读全文
List<T>与ObservableCollectio<T> 的区别
2013-09-17 22:12 by Andrew.Wangxu, 418 阅读, 收藏, 编辑
摘要:
在WPF中绑定通常会使用ObservableCollection,为什么不使用List呢?
简单是解释:List不包含值变通知功能,所以绑定了也许会出现绑定的数据与呈现数据不一致的问题。 通常绑定会使用 ObservableCollection。 因为 List没实现 INotifyCollectionChanged ,所以它只是一个普通的容器。~ 阅读全文
WPF 单实例应用程序
2013-09-17 22:08 by Andrew.Wangxu, 1103 阅读, 收藏, 编辑
摘要:
例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例。 这便是单实例应用程序。
对于这种单实例应用程序,WPF 本身并未提供解决方法,但是可以使用几种变通的方法。基本的技术是当触发 Application.StartUp 事件时,检查另一个应用程序是否正在运行。最简单的方法是使用一个全局的 mutex 对象(mutex对象是操作系统提供的一个用于进程之间通信的同步对象)。这种方法很简单但是功能有限——最重要的是,应用程序新实例无法和已经存在的实例进行通信。 因为当你打开文件的时候,比如*.doc 你需要将该文件的一些基本信息传递到已打开的实例中才行。 当然,你还可以使用 remoting、WCF 进行通信。那还得开发服务端,也使其变得复杂。 阅读全文
推荐一个 HTML5在线的流程图工具——ProcessOn
2013-09-17 21:27 by Andrew.Wangxu, 881 阅读, 收藏, 编辑
摘要:
一直想找个简单好用的UML建模工具,无意在茫茫百度中看见了网友推荐的N多工具,从中找了一个叫 ProcessOn 的工具,可以说非常棒。如果我是WEB开发人员,我肯定去深入研究HTML5啦,太令人着迷了。 上个图看看我画的~ 阅读全文
WPF Expander控件(扩展面板)
2013-09-14 16:28 by Andrew.Wangxu, 5717 阅读, 收藏, 编辑
摘要:
这算是我比较喜欢的一个控件,以前在Winform中也常用类似的。它包装了一块内容,通过单击一个小箭头按钮可以显示或隐藏所包含的内容。在线帮助以及Web页面经常使用这种技术,因为既可以包含大量内容,而又不会让用户面对大量的多余信息而感到无所适从。
使用 Expander控件是非常简单的——只需要在该控件内部包装希望使其能够折叠的内容,通常,每个 Expander 控件开始都是折叠的,但是可以在代码或标记中设置 IsExpanded 属性来改变这种行为。控件的折叠是非常有趣,展开于叠起自动排版,这是我非常喜欢的。 阅读全文
WPF 的拖拽操作(DragDrop)
2013-09-14 14:02 by Andrew.Wangxu, 4961 阅读, 收藏, 编辑
摘要:
在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样。如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化。重要的区别是用于拖放操作的方法和事件被集中到了 System.Windows.DragDrop 类中,然后供其他类(如 UIElement )使用。
本质上,拖放操作通过以下三个步骤进行:
用户单击一个元素或选择一个元素特定的区域,并保持鼠标为按下状态。这时,某些信息被搁置起来,并且拖放操作开始。
用户将鼠标移动到其他元素上。如果该元素可以接受正在拖动的内容类型,鼠标指针会变成拖放图标。否则鼠标指针会变成一个内部有一条线的圆形,表示不可拖入该数据。
当用户释放鼠标时,元素接收信息并作出决定如何处理接收到的信息。 阅读全文
WPF 隧道路由事件
2013-09-10 21:10 by Andrew.Wangxu, 758 阅读, 收藏, 编辑
摘要:
隧道路由事件的工作方式和冒泡路由事件相同,但方向相反。例如,如果 MouseUp 事件是一个隧道路由事件(实际上不是),在特殊的标签示例中单击图形将导致MouseUp 事件首先在窗口中引发、然后是在Grid 控件、接下来在 StackPanel 控件中引发,以此类推,直到到达实际源头,既标签中的图像为止。
很容易识别隧道路由事件,因为它们都以单词 Preview 开头。而且,WPF 通常成对地定义冒泡路由事件和隧道路由事件。这意味着如果发现一个冒泡的 MouseUp 事件,就还可以找到一个 PreviewMouseUp 事件。隧道路由事件总是在冒泡路由事件之前被触发的!
更有趣的是,如果将隧道路由事件标记为已处理过,那么冒泡路由事件就不会发生。这是因为两个事件共享同一个 RoutedEventArgs 类的实例。所以在操作的时候 一定要谨慎。 阅读全文
WPF 附加事件
2013-09-10 20:51 by Andrew.Wangxu, 1363 阅读, 收藏, 编辑
摘要:
在WPF中有许多控件有他们自己的特殊的事件。按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。
这回导致两难的境地。假设在 StackPanel 面板中包装了一堆按钮,并且希望在一个事件处理程序中处理所有这些按钮的单击事件。粗略的方法是将每个按钮 Click 事件都注册到同一个事件处理方法中。但是 Click 事件支持事件冒泡,从而提供了更好的一种选择。可以通过处理更高层次的元素的 Click 事件(如包含按钮的 StackPanel 面板)来处理所有的按钮单击事件。
这里会遇到一个问题,在StackPanel面板中并没有Click事件,正如上所说“按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。”,所以 XAML 解析器会解释成一个错误。解决方案是以“类名.事件名”的形式使用不同的关联事件语法。 阅读全文
WPF 冒泡路由事件
2013-09-08 11:52 by Andrew.Wangxu, 3123 阅读, 收藏, 编辑
摘要:
在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容。甚至可以多此重复嵌套,直到达到您所希望的层次深度。
这种可以任意嵌套的能力也带来了一个有趣的问题。例如,假设有一个标签,它包含一个StackPanel面板,该面板又包含了两块文本图像:
Image and text label
Courtesy of the StackPanel
正如您已经知道的,放在WPF窗口中 阅读全文
WPF 纯代码生成界面(不使用XAML)
2013-09-07 19:46 by Andrew.Wangxu, 2488 阅读, 收藏, 编辑
摘要:
对于编写 WPF 应用程序,只是用代码进行开发而不使用任何 XAML 不是常见的方式(但是仍然完全支持)。只使用代码进行开发的明显缺点是,有可能会使用编写 WPF 应用程序成为极端乏味的工作。 WPF 控件没有包含参数化的构造函数,因此即使为窗体添加一个简单的按钮也需要编写几行代码。只使用代码进行开发的一个潜在的优点是可以随意定制应用程序。例如,可以根据数据记录中的信息生成一个充满输入控件的窗体,或者可以根据当前的用户酌情添加或替换控件。需要的所有内容只不过是少量的条件逻辑。相比之下,如果使用XAML文档,它们只能作为固定不变的资源嵌入到程序集中。 阅读全文
XAML 中使用空格键(空白字符)
2013-09-07 18:27 by Andrew.Wangxu, 2552 阅读, 收藏, 编辑
摘要:
默认情况下,XAML折叠所有空白,这意味着包含空格、tab 键以及回车的长字符串将被转换为单个空格。而且,如果在一个元素内容之前或之后添加空白,这个空格将被完全忽略。
有时这并不是所期望的结果。例如,可能希望在按钮文本中包含一系列空格。在这种情况下,需要为元素使用 xml:space="preserve" 特性。
xml:space 特性是 XML 标准的一部分,并且是一个要么包含全部,要么什么都不包括的设置。一旦使用了设置,元素内的所有空白字符将被保留。如下标记: 阅读全文
WPF XAML 特殊字符(小于号、大于号、引号、&符号)
2013-09-07 18:14 by Andrew.Wangxu, 14283 阅读, 收藏, 编辑
摘要:
XAML 受限于 XML 规则。例如, XML 特别关注一些特殊字符,如 & 如果试图使用这些字符设置一个元素内容,将会遇到许多麻烦,因为 XAML 解析器认为您正在做其他的事情——例如,创建一个嵌套元素。
例如,假设需要创建一个包含文本的按钮。下面的标记是不能完成这一工作的: 阅读全文
WPF InitializeComponent() 方法介绍
2013-09-07 17:15 by Andrew.Wangxu, 3705 阅读, 收藏, 编辑
摘要:
当编译应用程序时,定义用户界面的 XAML(如 Window1.xaml)被转换为 CLR 类型声明,这些类型声明和代码隐藏类文件(如 Window1.xaml.cs)中逻辑代码融合到一起,形成单一的单元。
现在,Window1 类尚不具备有任何真正的功能。然而,它却包含了一个非常重要的细节 ——默认构造函数,当创建类的一个实例时,该构造函数调用 InitializeComponent() 方法。该方法在 WPF 应用程序中扮演着一个重要角色。因此,永远不要删除在窗口构造函数中的 InitializeComponent() 调用。同样,如果为窗口类添加另一个构造函数,也要确保调用 InitializeComponent() 方法。 阅读全文
WPF 渲染级别 (Tier)
2013-09-07 16:18 by Andrew.Wangxu, 2880 阅读, 收藏, 编辑
摘要:
在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 及以上版本相对应。 阅读全文