代码改变世界

WPF 单实例应用程序

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

推荐一个 HTML5在线的流程图工具——ProcessOn

2013-09-17 21:27 by Andrew.Wangxu, 433 阅读, 收藏, 编辑
摘要: 一直想找个简单好用的UML建模工具,无意在茫茫百度中看见了网友推荐的N多工具,从中找了一个叫 ProcessOn 的工具,可以说非常棒。如果我是WEB开发人员,我肯定去深入研究HTML5啦,太令人着迷了。 上个图看看我画的~阅读全文

WPF Expander控件(扩展面板)

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

WPF 的拖拽操作(DragDrop)

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

WPF 隧道路由事件

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

WPF 附加事件

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

WPF 冒泡路由事件

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

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

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

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

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

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

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

WPF InitializeComponent() 方法介绍

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

WPF 渲染级别 (Tier)

2013-09-07 16:18 by Andrew.Wangxu, 1169 阅读, 收藏, 编辑
摘要: 在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 及以上版本相对应。阅读全文

C# DataTable 转换为 实体类对象方法

2013-04-18 09:35 by Andrew.Wangxu, 574 阅读, 收藏, 编辑
摘要: 如果你的实体类与数据库表是完全一致的。 假设:{Code} //对应数据库表: //User //字段:ID、Name 那么你也许需要编写将DataTable 转换为实体对象的方法,便利DataTable.Rows 获得并填充。。 下面是我写的一个通用方法,分享+记录,便于日后直接Copy ~阅读全文

程序基址或游戏基址不变原理

2012-09-19 11:36 by Andrew.Wangxu, 512 阅读, 收藏, 编辑
摘要: windows 操作系统中运行的程序 是运行在在支持虚拟地址空间的计算机上,是基于保护模式下的操作, 将虚拟地址空间或者映射到一段真实的物理内存, 程序本身不能操作实际的物理内存地址, 通过 windows API ReadMemory 和 WriteMemory 操作的内存对象多是虚拟的内存对象, 并不是真实的内存,是经过操作系统物流内存向虚拟内存映射过的。 每一个 32 位的操作系统的程序所能达到的寻址空间为4G,所能使用的空间也为4G(借助于虚拟内存和页面置换的方法),所以每一次启动同一个程序, 该程序所对应的虚拟内存的基址是不变的。 不同的应用程序可能会操作同一个虚拟地址,但是其对应的阅读全文

C# 向计算机系统写入windows日志(系统日志)。

2012-09-18 12:06 by Andrew.Wangxu, 2152 阅读, 收藏, 编辑
摘要: public class SysLog { /// /// 系统日志所在的主机名。当前设定:本地电脑 /// public const string MACHINE_NAME = "."; /// /// 系统日志名。当前设定:应用程序 /// public const string LOG_NAME = "Application"; /// /// 消息事件类型。当前设定:无;该值为0的时候分类为“无”。 /// public const short CATEGORY = 0; /// /// 消息事件的种类:信息(Information),警告(Warning),重大错误(Erro阅读全文